首页 > 编程知识 正文

canny算子参数,matlab算子边缘检测

时间:2023-05-06 11:26:07 阅读:22107 作者:4542

图像的边缘信息主要集中在高频,一般称为图像锐化和边缘检测,实质上是高频滤波。 微分运算是求出信号变化率的运算,可知具有增强高频成分的作用。 在空域运算中,图像的锐化是计算微分。 由于数字图像的离散信号,微分运算计算差分和梯度。 图像处理中有各种边缘检测(梯度)算子,通常使用的是一般的一阶差分、Robert算子)交叉差分、Sobel算子等,是基于梯度强度的搜索。 拉普拉斯算子(二阶差分)基于过零点检测。 通过计算梯度并设定阈值,得到边缘图像。

什么是边缘? 图像的局部区域的亮度变化明显的部分,对灰度图像来说,也就是说,在灰度值方面存在显着变化,从一个灰度值到小缓冲区域急剧变化之后,变化成与另一灰度值大幅不同的灰度值。 较好的边缘提取方法是提高场景对边缘的敏感性,同时抑制噪声。

Canny算子求边缘点的具体算法步骤如下:

利用yqdmz滤波器对图像进行平滑,利用一阶偏导数有限差分计算梯度幅度和方向,对梯度幅度进行非极大值抑制,利用双阈值算法检测和连接边缘。

1、灰度化将彩色图像变成灰度图像。 本部分用Canny算法常规处理的图像是灰度级的,而用于获取彩色图像的话,必须首先进行灰度级化。 以RGB格式的彩色图表为例,灰度通常采用以下公式:

Gray=0.299R 0.587G 0.114B;

2、yqdmz滤波相对于图像yqdmz滤波,图像yqdmz滤波的实现可以在两个一维yqdmz核中分别用两次加权来实现,即在一维x方向进行卷积,所得到的结果再在一维y方向进行卷积。 当然,也可以直接通过一个二维yqdmz核的一次卷积来实现。 也就是说,二维卷积模板由于级别有限,所以只是如何计算二维卷积模板。

首先,一维yqdmz函数:

二维yqdmz函数:

模板各点的yqdmz系数可以通过上式计算。 这样得到的是最终的模板吗? 不,需要规范化。 也就是说,必须将各点的系数除以所有系数之和。 这是最终的二维yqdmz模板。

这有一个小知识点。 要计算上面的系数,您必须知道yqdmz函数的标准差(sigma )。 此外,还必须知道选择3*3还是5*5模板,即模板有多大。 在实际应用时,两者有关系。 根据数学统计知识,yqdmz分布的特征是数值分布为( 3, 3) ),因此模板窗口的大小通常采用1(2) ceil )3) nsigma ) ceil是ceil

通过计算得到模板。 那个就这样折叠就可以了。 卷积是指图像中点附近的模板大小区域乘以yqdmz模板区域的结果是该点的卷积结果。 卷积的中心意思是取得原始图像中模板特征那样的性质。

3、计算梯度值和方向图像的边缘可以指向不同的方向,因此经典的Canny算法采用4个梯度算子分别计算水平、垂直和对角线方向的梯度。 但是,通常不使用四个梯度运算符分别计算四个方向。 常见的边缘差分运算符(如Rober、Prewitt和Sobel )计算水平和垂直差分Gx和Gy。 这样可以按如下方式计算坡度大小和方向:

梯度角度范围从弧度-到,将其近似为水平、垂直、及表示两个对角线方向(0、45、90、135)的四个方向. 用I/8(I=1、3、5、7 )分割,对落入各区域的梯度角赋予特定的值,可以表示4个方向之一。

如果现在选择Sobel运算符并计算梯度,则Sobel运算符获得的边缘会相对于其他边缘运算符变粗和变亮。

下图是将Sobel运算符应用于上面半径为2的yqdmz模糊图像的l通道(HSL )的梯度示意图,没有应用任何阈值。

4、极大值以外的抑制极大值以外的抑制是进行边缘检测的重要步骤,一般意义上是寻找像素点的局部最大值。 沿着梯度方向,比较了其前后的梯度值。 请参照下图。

上图左右图: g1、g2、g3、g4都表示像素点,明显是c的8个区域中的4个。 左图的c点是我们应该判断的点,蓝色的直线是其梯度方向。 也就是说,如果c是局部极大值,则其梯度振幅m必须大于直线与g1g2和g2g3的交点、dtmp1和dtmp2的梯度振幅。 但是,dtmp1和dtmp2不是所有像素,而是子像素,也就是坐标是浮点,如何求出梯度振幅呢? 对于线性插值,例如dtmp1位于g1、g2之间,g1、g2的振幅都是已知的。 我们知道dtmp1的g1、g2之间的比率,就可以得到其梯度振幅。 比率可以从角度计算,角度是坡度的方向。

编写线性插值的表达式。 假设为g1的振幅m(g1 )、g2的振幅m(g1 ),则dtmp1得到如下。

(m(dtmp1)=w*m ) G2 ) (1-w ) * m (G1 ) ) ) ) ) 652 () )

其中w=距离(dtmp 1,g2 ) /距离(G1,g2 ) ) ) ) ) ) ) ) )。

距离(G1,g2 )表示两点之间的距离。 实际上,w是从梯度方向(振幅的正切和余切)得到的比例系数。

右图的4条直线是4个不同的情况,情况不同,g1、g2、g3、g4是c的8个区域中的

4个坐标会有所差异,但是线性插值的原理都是一致的。

下图是非最大值抑制的结果。可见边缘宽度已经大大减小。但是这个图像中因为没有应用任何阈值,还含有大量小梯度模值的点,也就是图中很暗的地方。下面,阈值要上场了。

 

5、双阈值的选取

一般的边缘检测算法用一个阈值来滤除噪声或颜色变化引起的小的梯度值,而保留大的梯度值。Canny算法应用双阈值,即一个高阈值和一个低阈值来区分边缘像素。如果边缘像素点梯度值大于高阈值,则被认为是强边缘点。如果边缘梯度值小于高阈值,大于低阈值,则标记为弱边缘点。小于低阈值的点则被抑制掉。

 

6、滞后边界跟踪

强边缘点可以认为是真的边缘。弱边缘点则可能是真的边缘,也可能是噪声或颜色变化引起的。为得到精确的结果,后者引起的弱边缘点应该去掉。通常认为真实边缘引起的弱边缘点和强边缘点是连通的,而又噪声引起的弱边缘点则不会。所谓的滞后边界跟踪算法检查一个弱边缘点的8连通领域像素,只要有强边缘点存在,那么这个弱边缘点被认为是真是边缘保留下来。

这个算法搜索所有连通的弱边缘,如果一条连通的弱边缘的任何一个点和强边缘点连通,则保留这条弱边缘,否则抑制这条弱边缘。搜索时可以用广度优先或者深度优先算法,我在这里实现了应该是最容易的深度优先算法。一次连通一条边缘的深度优先算法如下:

准备一个栈s,一个队列q,设联通指示变量connected为假。从图像的第一个点开始,进入2。如果这个点是弱边界点并且没有被标记,把它标记,并把它作为第一个元素放入栈s中,同时把它放入记录连通曲线的队列q,进入3。如果这个点不是弱边界或者已经被标记过,到图像的下一个点,重复2。从栈s中取出一个元素,查找它的8像素领域。如果一个领域像素是弱边界并且没有被标记过,把这个领域像素标记,并加入栈s中,同时加入队列q。同时查找领域对应的强边界图,如果有一个像素是强边界,表示这条弱边界曲线和强边界联通,设置connected为真。重复3直到栈中没有元素了。如果connected为假,则依次从队列q中取出每个元素,清空标记。如果connected为真,保留标记。清空队列q,设置connected为假,移动到图像的下一个点,到2。

 

7、结果查看

下面是对Lena图计算Canny边缘检测的梯度模图和二值化图,yqdmz半径2,高阈值100,低阈值50。

作为对比,下面是用一阶差分和Sobel算子对原图计算的结果,阀值100。由于一阶差分的梯度值相对较小,我对一阶差分的梯度值放大了一定倍数,使得它和Sobel的梯度值保持同样的水平。

很明显,Canny边缘检测的效果是很显著的。相比普通的梯度算法大大抑制了噪声引起的伪边缘,而且是边缘细化,易于后续处理。对于对比度较低的图像,通过调节参数,Canny算法也能有很好的效果。

(a)原图      

(b)Canny梯度模,yqdmz半径2,低阈值30,高阈值100       

(c)Canny梯度二值化图,yqdmz半径2,低阈值30,高阈值100

 

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