灰度图像--图像分割 Sobel算子

学习DIP第44天

转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意。有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!!

文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

开篇废话

废话开始,Sobel我们并不陌生,之前在图像增强的时候也已经介绍了它的作用,并且还杜撰了一下它的来历,也就是用Robert平移相加(类似于相关或卷积),下面可以给出Sobel的另一个来源,因为Sobel数学推导的过程和资料很少,而且当时提出Sobel的时候应该也是没有数学论证的,而只是简单的实验后,发现效果非常好。

我们还要介绍下扩展Sobel算子,Sobel原始模型为标准3x3模板,但可以扩展成5x5到任意奇数x奇数的大小,而模板系数的确定可以根据帕斯卡三角来计算,真的很神奇。Sobel之后延伸出了Scharr算子,这个算子也为3x3算子,但是效果据说比3x3的Sobel好,后面文章将会给出具体对比。

算子形式

数学形式的标准Sobel为:

此模板为最早提出的Sobel模板,由于模板的对称性,我们可以将它分解一下,并根据卷积的运算性质,可以得到:

也就是说,图像对Sobel 的响应等于,对模板分解后的小模板分别卷积,而观察小模板我们可以发现,其中[1,0,-1]或其转置为差分,也就是用于寻找边缘候选点的,而另一个[1,2,1]是一个标准平滑算子,这也就是很多书上说,Sobel具有平滑和微分的功效,原因就是这里了,也就是说,算子先将图像横向或纵向平滑,然后再纵向或横向差分,得到的结果是平滑后的差分结果。

或者,也可根据以下方式得到分解到的两个模板,其中星号表示卷积:

另一种得到模板的方法是通过帕斯卡三角,得到,并且帕斯卡三角的奇数行是最有高斯模板的整数系数的逼近,也就是说,高斯模板可以通过帕斯卡三角查询到其整数系数的近似,来观察帕斯卡三角:

其中标注的就可以用来生成扩展的Sobel算子,其中较常用的有5x5和7x7的模板。

用两个小模板分别卷积的另一个好处是减少计算量,对于使用大小为nxn的模板,卷积计算量为O(n*n*width*height)而分开成小模板卷积计算量是O(2*n*width*height)也就是O(n*width*height)减少了一项,当n相对较大的时候,计算量明显减少。

帕斯卡三角的计算是通过组合公式给出,具体不在这里描述,所以Sobel算子的模板计算方法我们就有了大概的了解。

opencv文档中给出了关于sobel算子的下面信息:

和上面描述的方法类似,更直观,可以用来理解sobel的模板结构,不同的差分方向带来的问题就是边缘方向的确定,由于算子属于一阶微分,也就是梯度算子之一,所以梯度方向信息也显得很重要,比如后面要说的canny就是用到了梯度方向的信息,所以,在确定方向时要注意算子的差分方向。

对于阶梯型边缘,计算过程及结果如下,红色为模板中心:

可以看到,相比于Robert算子,Sobel得到的边界候选位置相对较宽,而且包括全部的内边界和外边界。并且差分被放大了,也就是说,用Sobel算子处理后的图片有可能超过原图像灰度级别,对于这个问题,处理方法是将平滑分算子(分解后的平滑部分,例如【1,2,1】)归一化,得到的差值仍在原始灰度级范围内。

代码效果

代码:

double Sobel(double *src,double *dst,double *edgedriction,int width,int height,int sobel_size){
    //double SobelMask_x[3]={-1,-2,-1,0,0,0,1,2,1};
    double *dst_x=(double *)malloc(sizeof(double)*width*height);
    double *dst_y=(double *)malloc(sizeof(double)*width*height);
    if(sobel_size==3){
        double SobelMask1[3]={0.25,0.5,0.25};
        double SobelMask2[3]={1,0,-1};
        RealConvolution(src, dst_x, SobelMask1, width, height, 1, 3);
        RealConvolution(dst_x, dst_x, SobelMask2, width, height, 3, 1);

        RealConvolution(src, dst_y, SobelMask2, width, height, 1, 3);
        RealConvolution(dst_y, dst_y, SobelMask1, width, height, 3, 1);
    }else if(sobel_size==5){
        double SobelMask1[5]={0.0625,0.25,0.375,0.25,0.0625};
        double SobelMask2[5]={1/3.0,2/3.0,0,-2/3.0,-1/3.0};
        RealConvolution(src, dst_x, SobelMask1, width, height, 1, 5);
        RealConvolution(dst_x, dst_x, SobelMask2, width, height, 5, 1);

        RealConvolution(src, dst_y, SobelMask2, width, height, 1, 5);
        RealConvolution(dst_y, dst_y, SobelMask1, width, height, 5, 1);

    }else if(sobel_size==7){
        double SobelMask1[7]={0.015625,0.09375,0.234375,0.3125,0.234375,0.09375,0.015625};
        double SobelMask2[7]={0.1,0.4,0.5,0,-0.5,-0.4,-0.1};
        RealConvolution(src, dst_x, SobelMask1, width, height, 1, 7);
        RealConvolution(dst_x, dst_x, SobelMask2, width, height, 7, 1);

        RealConvolution(src, dst_y, SobelMask2, width, height, 1, 7);
        RealConvolution(dst_y, dst_y, SobelMask1, width, height, 7, 1);

    }
    if(edgedriction!=NULL)
        //getEdgeDirection(dst_x, dst_y, edgedriction, width, height);
        getEdgeAngle(dst_x, dst_y, edgedriction, width, height);
    for(int j=0;j<height;j++)
        for(int i=0;i<width;i++){
            dst[j*width+i]=abs(dst_x[j*width+i])+abs(dst_y[j*width+i]);
        }
    free(dst_x);
    free(dst_y);
    return findMatrixMax(dst,width,height);
}

下面对比3x3,5x5,7x7算子的效果:

原图:

局部放大:

阈值后

对比结论

Sobel算子的效果相比于其他算子,效果较好,而且计算量不大,可以用于实时系统,其结合简单的阈值可以得到较好的效果,但得到的边缘较宽,可以使用形态学细化。

待续。。。。

时间: 2024-10-10 13:37:28

灰度图像--图像分割 Sobel算子的相关文章

灰度图像--图像分割 Sobel算子,Prewitt算子和Scharr算子平滑能力比较

学习DIP第47天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发: https://github.com/Tony-Tan/DIPpro 开篇废话 依然是废话,这篇主要想对比下Sobel,Prewitt和Scharr算子的平滑能力,由于一阶微分对噪声响应强,进行微分之前进行降噪是非常必要的,这里我们进行的实验是,以lena图作为实验原图,取其中一行数据作为无噪声的原始信号,分别加上不

灰度图像--图像分割 Robert算子

学习DIP第43天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

灰度图像--图像分割 Prewitt算子

学习DIP第45天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

灰度图像--图像分割 边缘检测算子 综述

转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro 开篇废话 本来想这

灰度图像--图像分割 Scharr算子

学习DIP第46天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发: https://github.com/Tony-Tan/DIPpro ** 开篇废话 感受下markdown的写博客的感觉,好像在写程序一样,果然是程序员的好工具,不过开头怎么没有空格...一空格就自动变成代码了,这让我情何以堪,好吧,以后的文章开头不空格了.本来打算上一篇直接介绍Scharr算子,但是发现Prewi

灰度图像--图像分割 Marr-Hildreth算子(LoG算子)

学习DIP第49天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发: https://github.com/Tony-Tan/DIPpro 开篇废话 今天介绍二阶微分算子,二阶微分算子典型的是Laplace算子,LoG可以看成是一个高斯模板的拉普拉斯变换,但是也可以从根源上推导出LoG算子,而后面要介绍的DoG则是为了纯粹的减少计算,模拟LoG的一种方法. LoG原理 LoG最底层的原

灰度图像--图像增强 Robert算子、Sobel算子

学习DIP第36天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

学习 opencv---(11)OpenC 边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器

本篇文章中,我们将一起学习OpenCV中边缘检测的各种算子和滤波器--Canny算子,Sobel算子,Laplace算子以及Scharr滤波器.文章中包含了五个浅墨为大家准备的详细注释的博文配套源代码.在介绍四块知识点的时候分别一个,以及最后的综合示例中的一个.文章末尾提供配套源代码的下载. **** 给大家分享一个OpenCv中写代码是节约时间的小常识.其实OpenCv中,不用nameWindow,直接imshow就可以显示出窗口.大家看下文的示例代码就可以发现,浅墨在写代码的时候并没有用na

【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们将一起学习OpenCV中