美文网首页
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