1、sobel算子原理的理解
在图像处理上,算子一般也可以认为是滤波器,即filter,滤波器就是在一个像素点上对它进行与邻域之间的运算。
如中值滤波,就是在以像素点为中心,上下左右左上左下右上右下为邻域的集合里,如下图所示结构:
卷积核.png
中值滤波就是对P1到P9进行排序,然后获取数值大小排在中间的值,把这个值当做该中心像素点P5的新值。
而sobel算子,是为了用来计算边缘的,一般而言,以3x3为大小,有下面这两种形式,Gx和Gy,Gx用来计算垂直边缘,Gy用来计算水平边缘。
通常混合使用,会有 |G| = |Gx| + |Gy|,绝对值用于消除梯度方向的影响。
sobel算子.png如果按照上面P1到P9的排列,那么有:
Gx = |(P3+2P6+P9) - (P1+2P4+P7)|
Gy = |(P1+2P2+P3) - (P7+2P8+P9)|
这样的形式很好理解,假如中间为边缘,那么边缘两侧的亮度差距就会变大,乘以符号相反的系数,会使得最终的结果达到很大的值,在图像上来看就是白色;而不是边缘的区域,左右两边或者上下两边就会抵消,在图像上看就是黑色。
2、测试代码
原型
void Sobel( InputArray src, // 输入图像
OutputArray dst,// 输出图像
int ddepth,// 输出图像深度,通常
int dx, int dy, // x和y方向差分阶数
int ksize = 3,// Sobel核大小
double scale = 1,// 计算导数是可选的缩放因子,默认1
double delta = 0,// 计算结果存入dsy之前可选的delta值,默认0
int borderType = BORDER_DEFAULT );
void test9() {
Mat src = imread("D:/line2.png");
imshow("src", src);
Mat abs,abs1,abs2;
Sobel(src, abs, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(abs, abs1);
imshow("横向canny", abs1);
Sobel(src, abs, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(abs, abs2);
imshow("纵向canny", abs2);
Mat dst;
addWeighted(abs1, 0.5, abs2, 0.5, 0, dst);
imshow("dst", dst);
}
src.png
横向.png
纵向.png
dst
参考:https://blog.csdn.net/jaych/article/details/49516095?from=singlemessage&isappinstalled=0
网友评论