Sobel本质是基于图像空间域卷积,先来理解下卷积的基础知识。
注:对图像大矩阵和滤波小矩阵的对应位置元素进行相乘再求和的操作就叫做卷积。(Convolution)或协相关(Correlation).
协相关(Correlation)和卷积(Convolution)很类似, 两者唯一的差别就是卷积在计算前需要翻转卷积核, 协相关则不需要翻转
该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。其公式如下:
其中:
OpenCV实现了基于Sobel算子提取图像梯度的API,表示与解释如下
1 void Sobel( 2 InputArray src, 3 OutputArray dst, int ddepth, 4 int dx, 5 int dy, 6 int ksize = 3, 7 double scale = 1, double delta = 0, 8 int borderType = BORDER_DEFAULT ); 9 10 @param src 为输入图像,填Mat类型即可。 11 @param dst 即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。 12 @param ddepth 输出图像的深度。 13 若src.depth() = CV_8U, 取ddepth =-1/CV_16S/CV_32F/CV_64F 14 若src.depth() = CV_16U/CV_16S, 取ddepth =-1/CV_32F/CV_64F 15 若src.depth() = CV_32F, 取ddepth =-1/CV_32F/CV_64F 16 若src.depth() = CV_64F, 取ddepth = -1/CV_64F 17 @param dx x 方向上的差分阶数。 18 @param dy y方向上的差分阶数。 19 @param ksize 有默认值3,表示Sobel核的大小;必须取1,3,5或7。 20 @param scale 计算导数值时可选的缩放因子,默认值是1,表示默认情况下是没有应用缩放的。我们可以在文档中查阅getDerivKernels的相关介绍,来得到这个参数的更多信息。 21 @param delta 表示在结果存入目标图(第二个参数dst)之前可选的delta值,有默认值0。 22 @param borderType 边界模式,默认值为BORDER_DEFAULT。这个参数可以在官方文档中borderInterpolate处得到更详细的信息
1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 4 using namespace cv; 5 using namespace std; 6 7 int main(int artc, char** argv) { 8 Mat src = imread("src_sobel.jpg"); 9 if (src.empty()) { 10 printf("could not load image...\n"); 11 return -1; 12 } 13 namedWindow("input", CV_WINDOW_AUTOSIZE); 14 imshow("input", src); 15 Mat grad_x, grad_y; 16 Mat dst; 17 Sobel(src, grad_x, CV_32F, 1, 0, 3, 1, 0, BORDER_DEFAULT); 18 Sobel(src, grad_y, CV_32F, 0, 1, 3, 1, 0, BORDER_DEFAULT); 19 20 convertScaleAbs(grad_x, grad_x); 21 convertScaleAbs(grad_y, grad_y); 22 23 add(grad_x, grad_y, dst, Mat(), CV_16S); 24 convertScaleAbs(dst, dst); 25 26 imshow("grad_x", grad_x); 27 imshow("grad_y", grad_y); 28 imshow("gradient", dst); 29 30 waitKey(0); 31 32 return 0; 33 }
原文:https://www.cnblogs.com/zhaobinyouth/p/12171497.html