Scharr滤波器
视频讲解如下:
当前系列所有demo下载地址:
https://github.com/GaoRenBao/OpenCv4-Demo
不同编程语言对应的OpenCv版本以及开发环境信息如下:
语言 | OpenCv版本 | IDE |
C# | OpenCvSharp4.4.8.0.20230708 | Visual Studio 2022 |
C++ | OpenCv-4.5.5-vc14_vc15 | Visual Studio 2022 |
Python | OpenCv-Python (4.6.0.66) | PyCharm Community Edition 2022.1.3 |
首先需要准备一张图片Crab.jpg,如下

经过Scharr滤波器操作的效果如下:

下面给大家演示了C#、C++、Python这三种环境下是如何进行Scharr滤波器操作。
C#版本代码如下:
C#版本需要安装“OpenCvSharp4”、“OpenCvSharp4.runtime.win”两个库才行。不然会报错。
如果需要使用“ BitmapConverter.ToBitmap”操作,则需要追加安装“OpenCvSharp4.Extensions”库。
using OpenCvSharp;
namespace demo
{
internal class Program
{
// https://shimat.github.io/opencvsharp_docs/html/d69c29a1-7fb1-4f78-82e9-79be971c3d03.htm
static void Main(string[] args)
{
//【0】创建 grad_x 和 grad_y 矩阵
Mat grad_x = new Mat();
Mat grad_y = new Mat();
Mat abs_grad_x = new Mat();
Mat abs_grad_y = new Mat();
Mat dst = new Mat();
// 【1】载入原始图
Mat src = Cv2.ImRead("../../../images/Crab.jpg");
// 【2】显示原图
Cv2.ImShow("原图", src);
// 【3】求 X方向梯度
Cv2.Scharr(src, grad_x, MatType.CV_16S, 1, 0, 1, 0, BorderTypes.Default);
Cv2.ConvertScaleAbs(grad_x, abs_grad_x);
Cv2.ImShow("【效果图】 X方向Scharr", abs_grad_x);
// 【4】求 Y方向梯度
Cv2.Scharr(src, grad_y, MatType.CV_16S, 0, 1, 1, 0, BorderTypes.Default);
Cv2.ConvertScaleAbs(grad_y, abs_grad_y);
Cv2.ImShow("【效果图】 Y方向Scharr", abs_grad_y);
// 【5】合并梯度(近似)
Cv2.AddWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
// 【6】显示效果图
Cv2.ImShow("【效果图】合并梯度后Scharr", dst);
Cv2.WaitKey();
// 【7】在pictureBox1中显示效果图
//Bitmap map = BitmapConverter.ToBitmap(dst);
//pictureBox1.Image = map;
}
}
}
C++版本代码如下:
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
//【0】创建 grad_x 和 grad_y 矩阵
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y, dst;
//【1】载入原始图
Mat src = imread("../images/Crab.jpg");
//【2】显示原始图
imshow("【原始图】Scharr滤波器", src);
//【3】求 X方向梯度
Scharr(src, grad_x, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
imshow("【效果图】 X方向Scharr", abs_grad_x);
//【4】求Y方向梯度
Scharr(src, grad_y, CV_16S, 0, 1, 1, 0, BORDER_DEFAULT);
convertScaleAbs(grad_y, abs_grad_y);
imshow("【效果图】Y方向Scharr", abs_grad_y);
//【5】合并梯度(近似)
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
//【6】显示效果图
imshow("【效果图】合并梯度后Scharr", dst);
waitKey(0);
return 0;
}
Python版本代码如下:
import cv2
def zh_ch(string):
return string.encode("gbk").decode(errors="ignore")
# 【1】载入原始图
src = cv2.imread('../images/Crab.jpg')
# 【2】显示原始图
cv2.imshow(zh_ch('原始图'), src)
# 【3】求 X方向梯度
grad_x = cv2.Scharr(src, cv2.CV_16S, 1, 0, None, 1, 0, cv2.BORDER_DEFAULT)
abs_grad_x = cv2.convertScaleAbs(grad_x)
cv2.imshow(zh_ch('X方向Scharr'), abs_grad_x)
# 【4】求 Y方向梯度
grad_y = cv2.Scharr(src, cv2.CV_16S, 0, 1, None, 1, 0, cv2.BORDER_DEFAULT)
abs_grad_y = cv2.convertScaleAbs(grad_y)
cv2.imshow(zh_ch('Y方向Scharr'), abs_grad_y)
# 【5】合并梯度(近似)
dst = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)
# 【6】显示效果图
cv2.imshow(zh_ch('【效果图】合并梯度后Scharr'), dst)
cv2.waitKey(0)
cv2.destroyAllWindows()