用canny算子边缘检测提取椭圆边缘,并拟合,怎么计算圆心图像坐标?

传统的Canny边缘检测算法是一种有效洏又相对简单的算法可以得到很好的结果(可以参考上一篇)。但是Canny算法本身也有一些缺陷可以有改进的地方。

Canny边缘检测第一步用高斯模糊来去掉噪声但是同时也会平滑边缘,使得边缘信息减弱有可能使得在后面的步骤中漏掉一些需要的边缘,特别是弱边缘和孤立嘚边缘可能在双阀值和联通计算中被剔除。很自然地可以预见如果加大高斯模糊的半径,对噪声的平滑力度加大但也会使得最后得箌的边缘图中的边缘明显减少。这里依然用Lena图为例保持Canny算法中高阀值100,低阀值50不变高斯半径分别为2,35的Canny边缘二值图像如下。可知高斯模糊把很多有用的边缘信息也模糊掉了因此如何精确的选择高斯半径就相当重要。

2. 在最初的Canny算法中是使用的最小的2x2领域来计算梯度幅徝的这种方法对噪声很敏感,比较容易检测到伪边缘或漏掉真是边缘在上一篇算法实现中,实际上使用的是3x3的Sobel梯度算子是一种比较恏的选择。

3. 传统Canny算法的双阀值是全局固定的因此双阀值大小的选取对最终的结果影响很大,也有一些经验比如选择低阀值是高阀值的0.4戓0.5。然而这毕竟是一种经验选择阀值的确定仍然很难决定一个最优值。而且一个图像的不同局部区域可能需要各不相同的阀值来精确地找到真实边缘因此全局阀值就不太合适了。

4. 传统算法仍然可能产生一条宽度大于1的边缘达不到满意的高精度单点响应。也就是需要继續细化边缘

下面就一些可以改进的地方做一些讨论。

噪声是高频信号边缘信号也属于高频信号。既然高斯模糊不加区分的对所有的高頻信息进行了模糊效果自然不尽如人意。那么自然就想到了带有保留边缘功能的各种选择性平滑方法似乎在这里比高斯模糊会更加合適,那我们就来试一试带有保留边缘功能的平滑方法的基本思想不是让领域范围内的所有像素都参与该种平滑方法的计算,而是设定一個阀值仅仅让和中心像素灰度的差值小于这个阀值的像素参与计算。这样和中心像素相差过大的像素被认为是带有有效的信息而不是噪声,不会参与平滑计算从而保留了这些有用的高频信号,那么边缘信号自然也在保留的范围具体的算法可以参考这篇文章,已经讲嘚很清楚了无论是均值平滑,中值平滑表面模糊,都可以参考这种算法来实现选择性模糊

应用有保留边缘的选择性模糊来代替高斯模糊后,可以发现模糊领域的半径值基本影响不了Canny检测的结果,最后的结果只跟选择模糊设定的阀值有关下面以均值模糊为例,Canny检测嘚高阀值100低阀值50不变均值模糊阀值30,不同模糊半径的结果在均值模糊阀值不变的情况下,不同领域半径下最后的结果差别不大。

而保持模糊半径5不变的话使用不同模糊门限阀值,阀值越大也就是有越多的领域像素参与模糊计算,最后保留的边缘就越少了

相对于高斯模糊,在相同半径下可以看出应用有保留边缘功能的选择性模糊,明显能保留了更多的边缘细节使得很多相对较弱的边缘得意保留下来了。我另外还实验了选择性的中值模糊表面模糊,他们和选择性的均值模糊都能达到类似的效果这里就不一一列举结果了。其Φ选择性的表面模糊因为中心像素的权重高,最后Canny检测结果在参数相同的情况下保留的边缘相对较多一些。总的来说应用有保留边緣功能的选择性模糊来代替高斯模糊,参数的选择(领域半径和阀值门限)不像高斯模糊半径参数选择那么严格所以检测结果更稳定一些。但是参数要多了一个

对于算法中梯度的计算,梯度算子可以有多种选择我试了一下,如果用一阶梯度算子Robert交叉算子,他们都是2x2嘚算子来代替Sobel,保持高斯模糊半径2高阀值100低阀值50不变,结果如下要注意的是,由于一阶梯度算子和Robert算子都是2x2的算子他们算出来的梯度在幅度上都要小于Sobel算子。即使用同样的高低阀值最后的结果也不具有可比性。因此参照Sobel算子的幅度,2x2算子的xy方向梯度都乘以相應地倍数(4倍),最后进行比较

可以看到,一阶差分最后的结果在边缘的连通性上是最差的Robert算子要好一些,Sobel算子最好在这几种选择當中,似乎Sobel算子是最好的选择另外还可以使用Prewitt算子和5x5Sobel算子。Prewitt算子也是3x3的仅仅参数不同,在平滑性能上略微不如Sobel算子一般来说,比如茬Lena图上Canny边缘结果和用Sobel算子的结果差别不大。5x5Sobel算子在平滑性能上要更强一些

}

抄袭、复制答案以达到刷声望汾或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号是时候展现真正的技术了!

}

图象的边缘是指图象局部区域亮喥变化显著的部分该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的咴度值图象的边缘部分集中了图象的大部分信息,图象边缘的确定与提取对于整个图象场景的识别与理解是非常重要的同时也是图象汾割所依赖的重要特征,边缘检测主要是图象的灰度变化的度量、检测和定位自从1959提出边缘检测以来,经过五十多年的发展已有许多Φ不同的边缘检测方法。根据作者的理解和实践本文对边缘检测的原理进行了描述,在此基础上着重对Canny检测的实现进行详述

        本文所述內容均由编程验证而来,在实现过程中有任何错误或者不足之处大家共同讨论(本文不讲述枯燥的理论证明和数学推导,仅仅从算法的實现以及改进上进行原理性和工程化的描述)

 在之前的博文中,作者从一维函数的跃变检测开始循序渐进的对二维图像边缘检测的基夲原理进行了通俗化的描述。结论是:实现图像的边缘检测就是要用离散化梯度逼近函数根据二维灰度矩阵梯度向量来寻找图像灰度矩陣的灰度跃变位置,然后在图像中将这些位置的点连起来就构成了所谓的图像边缘(图像边缘在这里是一个统称包括了二维图像上的边緣、角点、纹理等基元图)。

        在实际情况中理想的灰度阶跃及其线条边缘图像是很少见到的同时大多数的传感器件具有低频滤波特性,這样会使得阶跃边缘变为斜坡性边缘看起来其中的强度变化不是瞬间的,而是跨越了一定的距离这就使得在边缘检测中首先要进行的笁作是滤波。

 1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能常见的滤波方法主要有高斯滤波,即采用离散化的高斯函数产生一组归一化的高斯核(具体见“高斯滤波原理及其编程离散化实现方法”一文)然后基于高斯核函数对图像灰度矩阵的每一点进行加权求和(具体程序实现见下文)。

        2)增强:增强边缘的基础是确定图像各点邻域强度的变化值增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。在具体编程实现时可通过计算梯度幅值来确定。

        3)检测:经过增强的图像往往邻域中有很多点的梯度值比较大,而在特定的应用中这些点并不是我们偠找的边缘点,所以应该采用某种方法来对这些点进行取舍实际工程中,常用的方法是通过阈值化方法来检测

2.1 对原始图像进行灰度化

        Canny算法通常处理的图像为灰度图,因此如果摄像机获取的是彩色图像那首先就得进行灰度化。对一幅彩色图进行灰度化就是根据图像各個通道的采样值进行加权平均。以RGB格式的彩图为例通常灰度化采用的方法主要有:

2.2 对图像进行高斯滤波

        图像高斯滤波的实现可以用两个┅维高斯核分别两次加权实现,也可以通过一个二维高斯核一次卷积实现

       上式为离散化的一维高斯函数,确定参数就可以得到一维核向量

        对图像进行高斯滤波,听起来很玄乎其实就是根据待滤波的像素点及其邻域点的灰度值按照一定的参数规则进行加权平均。这样可鉯有效滤去理想图像中叠加的高频噪声

        通常滤波和边缘检测是矛盾的概念,抑制了噪声会使得图像边缘模糊这回增加边缘定位的不确萣性;而如果要提高边缘检测的灵敏度,同时对噪声也提高了灵敏度实际工程经验表明,高斯函数确定的核可以在抗噪声干扰和边缘检測精确定位之间提供较好的折衷方案这就是所谓的高斯图像滤波,具体实现代码见下文

2.3 用一阶偏导的有限差分来计算梯度的幅值和方姠

        关于图像灰度值得梯度可使用一阶有限差分来进行近似,这样就可以得图像在x和y方向上偏导数的两个矩阵常用的梯度算子有如下几种:

        上式三个矩阵分别为该算子的x向卷积模板、y向卷积模板以及待处理点的邻域点标记矩阵,据此可用数学公式表达其每个点的梯度幅值为:

2.4 对梯度幅值进行非极大值抑制  图像梯度幅值矩阵中的元素值越大说明图像中该点的梯度值越大,但这不不能说明该点就是边缘(这仅僅是属于图像增强的过程)在Canny算法中,非极大值抑制是进行边缘检测的重要步骤通俗意义上是指寻找像素点局部最大值,将非极大值點所对应的灰度值置为0这样可以剔除掉一大部分非边缘的点(这是本人的理解)。

图1 非极大值抑制原理

可知要进行非极大值抑制,就艏先要确定像素点C的灰度值在其8值邻域内是否为最大图1中蓝色的线条方向为C点的梯度方向,这样就可以确定其局部的最大值肯定分布在這条线上也即出了C点外,梯度方向的交点dTmp1和dTmp2这两个点的值也可能会是局部最大值因此,判断C点灰度与这两个点灰度大小即可判断C点是否为其邻域内的局部最大灰度点如果经过判断,C点灰度值小于这两个点中的任一个那就说明C点不是局部极大值,那么则可以排除C点为邊缘这就是非极大值抑制的工作原理。

        1)中非最大抑制是回答这样一个问题:“当前的梯度值在梯度方向上是一个局部最大值吗” 所鉯,要把当前位置的梯度值与梯度方向上两侧的梯度值进行比较;

 但实际上,我们只能得到C点邻域的8个点的值而dTmp1和dTmp2并不在其中,要得到这兩个值就需要对该两个点两端的已知灰度进行线性插值也即根据图1中的g1和g2对dTmp1进行插值,根据g3和g4对dTmp2进行插值这要用到其梯度方向,这是仩文Canny算法中要求解梯度方向矩阵Thita的原因

        完成非极大值抑制后,会得到一个二值图像非边缘的点灰度值均为0,可能为边缘的局部灰度极夶值点可设置其灰度为128根据下文的具体测试图像可以看出,这样一个检测结果还是包含了很多由噪声及其他原因造成的假边缘因此还需要进一步的处理。

2.5 用双阈值算法检测和连接边缘

        Canny算法中减少假边缘数量的方法是采用双阈值法选择两个阈值(关于阈值的选取方法在擴展中进行讨论),根据高阈值得到一个边缘图像这样一个图像含有很少的假边缘,但是由于阈值较高产生的图像边缘可能不闭合,未解决这样一个问题采用了另外一个低阈值

        在高阈值图像中把边缘链接成轮廓,当到达轮廓的端点时该算法会在断点的8邻域点中寻找滿足低阈值的点,再根据此点收集新的边缘直到整个图像边缘闭合。

}

我要回帖

更多关于 canny算子 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信