首页 > 编程知识 正文

Robert算子,canny边缘检测算法流程

时间:2023-05-04 04:04:24 阅读:22108 作者:4304

正好在培训以及不久前利用边缘方面的知识开发项目,将相关知识作为培训资料进行了整理。 很久没写博览会了,知识需要整理。

一、边缘的重要性

在图像处理中边缘的重要性是不言而喻的。 虽然目前AI的前沿技术只是深度学习,但图像中的深度学习建模所需的许多特征都是从边缘开始向上配置更高级别的特征描述。 看看下面的例子。 本示例摘自zouxy09关于深度学习的文章。 (深度学习) (学习笔记整理系列)

1995年前后,Bruno Olshausen和David Field两位学者在Cornell University工作。 他们曾试图用生理学和计算机两种手段,双管齐下地研究视觉问题。

他们收集了很多黑白风景照片,从这些照片中,提取了400个小碎片。 每张照片碎片的大小为16x16像素。 可以将这400个碎片标记为S[i],i=0, 399吧。 接下来,从这些黑白风景照片中随机提取另一个碎片。 大小也是16x16像素。 请把这个碎片标记为t。

他们提出的问题应该是,如何从这400个碎片中选择一组碎片,S[k],通过重叠,与随机选择的目标碎片t尽可能相似,同时,S[k]的数量为用数学语言记述,如下所示。

sum_k(a[k]*S[k] )-- T。 这里,a[k]是碎片s[k]重叠时的权重系数。

为了解决这个问题,Bruno Olshausen和David Field发明了算法、稀疏编码。

稀疏编码是一个迭代的过程,每个迭代分为两个阶段。

1 )选择一组s(k ),并调整a ) k ),使得sum_k ) a ) k ) s ) k ) )最接近t。

2 )固定a(k ),在400个碎片中选择其他更合适的碎片s ) ) k )而不是原始s ) k ),使得sum_k ) a ) k ) s ) k ) )最接近t。

经过几次反复,选定了最佳的S[k]组合。 令人惊讶的是,被选中的S[k]基本上是照片上不同物体的边缘线,这些线段的形状相似,区别在于方向。

Bruno Olshausen和David Field算法的结果与David Hubel和Torsten Wiesel的生理发现一致!

也就是说,复杂的图形往往由一些基本结构组成。 例如,图可以用64种正交的edges (可以理解为正交的基本结构)线性表示。 例如,样本的x可以以0.8、0.3和0.5的权重调整1-64个edges中的3个。 其他基本的edge没有贡献,所以都是0。

图1

上面的例子只是说明了边缘特征的重要性。 然后扯下来。

二、边缘定义及类型

定义:边缘是不同区域的边界,是周围(局部)像素变化明显的像素集合,有振幅和方向两个属性。 请记住,这不是绝对的定义,主要是边缘是局部特征,周围的像素会显著变化,产生边缘。

tips :轮廓与边缘的关系。 轮廓被认为是描述物体的完整边界,边缘点一个个连接起来构成轮廓。 边缘可以是边缘,轮廓通常是完整的。 人眼的视觉特性一般是在观看物体时,首先获取物体的轮廓信息,然后获取物体中的细小信息。 例如,看到几个人站在那里,我们一眼看到过去就马上明白的是每个人又矮又胖的人,获取脸部和服装等信息。

类型:可简单分为阶梯型、屋顶型、斜坡型、脉冲型4种类型。 其中,阶梯型和斜坡型类似,但变化的速度不同。 同样,屋顶型和脉冲型也是如此。 参照图2,a (和b )被认为是阶梯型或斜坡型,c )脉冲型,d )屋顶型,与阶梯上升或下降到某个值之后接着,而屋顶先上升后下降。

图2边缘类型

三、图像边缘描述

关注台阶和屋顶型的边缘,边缘用微分算子绘制。 参照图3

图3

在数学中,函数的变化率用导数表示。 图像视为二维函数。 其上的像素值的变化当然也可以用导数表示。 当然图像是离散的,所以可以置换为像素的差分来实现。 对于阶跃边缘,图3示出一阶导数具有极大值,极大值点对应于二阶导数的过零点,即精确边缘的位置是对应于一阶导数的极大值点,或者二阶导数的过零点(例如

值的位置,而且是正负值过渡的零点)。故边缘检测算子的类型当然就存在一阶和二阶微分算子。

四、边缘检测算子类别

        

     常见边缘检测算子:Roberts 、Sobel 、Prewitt、Laplacian、Log/Marr、Canny、Kirsch、Nevitia

       一阶微分算子:Roberts 、Sobel 、Prewitt

        Robert算子是第一个边缘检测算子,提出者Lawrence Roberts in 1963。维基百科见Roberts cross

        Sobel边缘算子,当年作者并没有公开发表过论文,仅仅是在一次博士生课题讨论会(1968)上提出("A 3x3 Isotropic Gradient Operator for Image Processing"),后在1973年出版的一本专著("Pattern Classification and Scene Analysis")的脚注里作为注释出现和公开的。提出者Irwin Sobel。

        Prewitt算子来自J.M.S. Prewitt "Object Enhancement and Extraction" in "Picture processing and Psychopictorics", Academic Press,1970。

        我们看这三种边缘检测算子模板及写成差分的形式

 Roberts算子

Sobel算子

Prewitt算子

图 4 一阶微分算子

       如何计算边缘幅值与方向?以Sobel算子为例。3*3 Sobel两个方向的算子在图像上滑动,模板与其覆盖的图像3*3区域9个像素进行卷积,求和后得到此方向的边缘检测幅值。

 

f(x,y)为图像,Gx和Gy分别是水平和竖直方向算子的卷积结果,G则是最终得到的边缘幅值,θ值则是边缘方向。当然G的计算有时简化为

  

或者

 

求幅值时是有多种选择的,一般根据具体应用选择用水平还是竖直或是两个方向同时检测。

        另外,需要说明的是,Sobel算子还有一种变种,是各向同性Sobel算子,其模板为

图 5 各向同性Sobel算子

Sobel各向同性算子的权值比普通Sobel算子的权值更准确。为什么?模板的权值是离中心位置越远则权值(看绝对值)影响越小,如上图,把模板看成是9个小正方形,小正方形边长为1,则虚线三角形的斜边长为,下直角边长为1,则如果(0,0)位置权值绝对值大小为1,则按照距离关系,位置(1,0)处的权值绝对值大小应该为才是准确的。

       二阶微分算子:Laplacian、Log/Marr

        拉普拉斯算子来自拉普拉斯变换,而Log算子又称Marr算子,由David Courtnay Marr和Ellen Hildreth(1980)共同提出,计算神经学创始人Marr在1980年正式发表论文时,因换白血病早逝,后面设立Marr奖以此纪念其贡献,现在每两年的ICCV(与ECCV,CVPR并称计算机视觉三大顶级会议)会评出一个Marr奖。这两种算子模板如下:

Laplacian算子(两种模板)

Log算子

图 6 二阶微分算子

 

拉普拉斯算子数学公式是

写成差分形式为

        Log边缘检测则是先进行yedhb滤波再进行拉普拉斯算子检测,然后找过零点来确定边缘位置,很多时候我们只是知道Log 5*5模板如上图所示,但是具体是怎么得到的?下面进行推导。

二维yedhb公式是

按拉普拉斯算子公式求x,y方向的二阶偏导后为

这里x,y不能看成模板位置,应看成是模板其他位置到中心位置的距离。那么写成

这里x0,y0就是模板中心位置,x,y是模板其他位置,对于5*5模板,则x0=2,y0 = 2,那对于模板中(0,0)位置的权值,即把x= 0,y= 0,x0= 2,y0 = 2带入上式,另= 1,得到约等于0.0175,这样得到

通过取整变符号,且模板总和为0,得到图6所示的模板。

        另外,这里模板大小是如何取的?通常yedhb分布中,在(-3,3)的范围内就覆盖了绝大部分区域,所以模板大小一般取dim = 1 + 6(在SIFT特征中,其中的yedhb模糊也是这样取),dim如果为小数,则取不小于dim的最小整数,当然实际使用时没有这么严格,如上面我们取=1时,模板大小取5*5。那同一个尺寸的模板中的权值调整就是的变化得到的,变化到一定程度,模板尺寸大小改变(这个是个人理解,欢迎拍砖)。

 

       非微分边缘检测算子:Canny

       Canny边缘检测大家应该很熟悉,这里列出步骤,并给出一个详细介绍的链接Canny算子。

    1.      彩色图像转换为灰度图像
    2.      对图像进行yedhb模糊
    3.      计算图像梯度,根据梯度计算图像边缘幅值与角度(这里其实用到了微分边缘检测算子来计算梯度幅值方向)
    4.      非最大信号压制处理(边缘细化)
    5.      双阈值边缘连接处理
    6.      二值化图像输出结果

   方向算子Kirsch(8个3*3模板),Nevitia (12个5*5模板)

        这两个算子是利用多个方向的子模板进行分别计算,最后取幅值最大的那个为最终边缘幅值,方向即最大幅值对应的那个方向

 

五、各边缘检测算子对比

 

opencv直接调用的Roberts和Prewitt边缘检测

 

 

 

自己写的Sobel算子,分别进行竖直和水平边缘检测,最后取竖直和水平边缘最大幅值

 

opencv直接调用的Laplacian和Canny边缘检测

 

Log 5*5模板,可以看出Log检测出的边缘很多并不是真正的边缘位置,下图没有经过过零点排除一些边缘点,噪声被充分检测出来。

 

当然,有很多关于以上边缘检测算子的理论解释及特性等可以参考以下几篇博文:

1、http://blog.csdn.net/xiaojiegege123456/article/details/7714863

2、http://blog.csdn.net/yanmy2012/article/details/8110316

3、http://blog.csdn.net/langb2014/article/details/45667921

参考资料:

1、安静的身影.《经典边缘检测算子比较》.南京信息工程大学.

2、百度百科“Sobel算子”

3、http://blog.csdn.net/a361251388leaning/article/details/50288479

4、http://blog.csdn.net/zouxy09/article/details/8775488

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。