美文网首页
OpenCV图像处理(十一)边缘检测算子:Sobel算子

OpenCV图像处理(十一)边缘检测算子:Sobel算子

作者: 行走行囊 | 来源:发表于2018-04-17 06:56 被阅读0次

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

相关文章

网友评论

      本文标题:OpenCV图像处理(十一)边缘检测算子:Sobel算子

      本文链接:https://www.haomeiwen.com/subject/ymdohftx.html