主要内容

imfindcircles

使用圆形霍夫变换找到圆

描述

中心= imfindcircles (一个半径找到图像中的圆一个半径近似等于什么半径.输出,中心,是一个两列矩阵,包含(x, y)图像中圆心的坐标。

中心半径) = imfindcircles (一个radiusRange查找半径在指定范围内的圆radiusRange.附加的输出参数,半径中每个圆心对应的估计半径中心

例子

中心半径度规) = imfindcircles (一个radiusRange也返回一个列向量,度规,包含每个圆的累加器阵列峰值的大小(按降序排列)。的行中心而且半径对应的行度规

例子

___) = imfindcircles (___名称,值使用任何前面的语法,指定带有一个或多个名称-值参数的其他选项。

例子

全部折叠

这个例子展示了如何找到图像中的所有圆,以及如何保留和显示最强的圆。

将灰度图像读入工作空间并显示它。

一个= imread (“coins.png”);imshow (A)

图中包含一个axes对象。坐标轴对象包含一个image类型的对象。

求出所有有半径的圆r像素在[15,30]范围内。

[中心,半径,度量]= imfindcircles(A,[15 30]);

根据度量值保留五个最强的圆。

: centersStrong5 =中心(1:5);radiiStrong5 =半径(1:5);metricStrong5 =度量(1:5);

在原始图像上画出五个最强的圆周长。

viscircles (centersStrong5 radiiStrong5,“EdgeColor”“b”);

图中包含一个axes对象。坐标轴对象包含3个类型为line、image的对象。

将图像读入工作空间并显示它。

一个= imread (“circlesBrightDark.png”);imshow (A)

图中包含一个axes对象。坐标轴对象包含一个image类型的对象。

定义半径范围。

Rmin = 30;征求= 65;

找出图像中所有在半径范围内的亮圆。

[centersBright, radiiBright] = imfindcircles(A,[Rmin Rmax],“ObjectPolarity”“光明”);

找出图像中所有半径范围内的黑圈。

[centersDark, radiiDark] = imfindcircles(A,[Rmin Rmax],“ObjectPolarity”“黑暗”);

在亮圆的边缘画上蓝线。

viscircles (centersBright radiiBright,“颜色”“b”);

图中包含一个axes对象。坐标轴对象包含3个类型为line、image的对象。

在黑圈的边缘画上红色虚线。

viscircles (centersDark radiiDark,“线型”“——”);

图中包含一个axes对象。坐标轴对象包含5个类型为line、image的对象。

输入参数

全部折叠

用于检测圆形物体的输入图像,指定为灰度、真彩色(RGB)或二值图像。

数据类型:||int16|uint8|uint16|逻辑

圆半径,或您想要检测的圆形物体的近似半径,指定为一个正数。

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

要检测的圆形对象的半径范围,指定为形式为正整数的2元素向量[rmin做),在那里rmin小于征求

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64

名称-值参数

指定可选参数对为Name1 = Value1,…,以=家,在那里的名字参数名称和价值对应的值。名-值参数必须出现在其他参数之后,但对的顺序并不重要。

例子:中心= imfindcircles(半径,ObjectPolarity =明亮)指定深色背景上的明亮圆形对象。

在R2021a之前,名称和值之间用逗号隔开,并括起来的名字在报价。

例子:中心= imfindcircles(半径,“ObjectPolarity”、“明亮”)指定深色背景上的明亮圆形对象。

对象极性,指定为表中的值之一。

“光明” 圆形物体比背景更亮。
“黑暗” 圆形物体比背景暗。

用于计算累加器数组的计算方法,指定为表中的值之一。

“PhaseCode” 阿瑟顿和Kerbyson[1]phase-coding方法。
“二级” 该方法采用了两阶段圆霍夫变换[2][3]

例子:“方法”、“PhaseCode”指定了Atherton和Kerbyson的相位编码方法。

圆形霍夫变换累加器阵列的灵敏度因子,指定为范围为[0,1]的数字。当你提高敏感度的时候,imfindcircles检测更多圆形物体,包括微弱和部分模糊的圆形。较高的灵敏度值也会增加误检的风险。

边缘梯度阈值,用于确定图像中的边缘像素,指定为范围[0,1]中的数字。指定0将阈值设置为零梯度幅度。指定1将阈值设置为最大梯度幅度。imfindcircles当您将阈值设置为较低值时,将检测到更多的圆形对象(具有弱和强边缘)。随着阈值的增加,它检测到的弱边缘圆越来越少。默认情况下,imfindcircles使用函数自动选择边缘梯度阈值graythresh

例子:“EdgeThreshold”,0.5

输出参数

全部折叠

圆心的坐标,返回为P——- - - - - -2矩阵包含x-第一列圆心的坐标y-坐标在第二列。行数,P为检测到的圆数。中心是根据圆圈的强度排序的,从强到弱。

数据类型:

圆圆心的估计半径,作为列向量返回。的半径值半径(j)对应于圆心在中心(j,:)

数据类型:

圆强度提供圆中心的相对强度,作为列向量返回。的价值度量(j)对应于有半径的圆半径(j)集中在中心(j,:)

数据类型:

提示

  • 的准确性imfindcircles的价值是有限的半径(或rmin)小于或等于5。

  • 如果使用(默认值),半径估计步骤通常会更快。“PhaseCode”方法,而不是“二级”

  • 两种计算方法,“PhaseCode”而且“二级”检测同心圆的能力有限。同心圆的结果会因输入图像的不同而不同。

  • imfindcircles不会在图像的区域外找到圆心的圆。

  • imfindcircles使用函数将真彩色图像转换为灰度rgb2gray在处理之前。二进制(逻辑)和整数类型的图像转换为数据类型使用im2single函数在处理之前。为了提高二值图像结果的准确性,imfindcircles还应用高斯平滑使用imfilter作为预处理步骤。

算法

imfindcircles使用基于圆形霍夫变换(CHT)的算法在图像中寻找圆。使用这种方法是因为它在噪声、遮挡和变化的光照存在下的鲁棒性。

CHT并不是一个严格指定的算法,相反,在它的实现中可以采用许多不同的方法。然而,所有方法都有三个共同的重要步骤。

  1. 累加器数组的计算

    高梯度的前景像素被指定为候选像素,并允许在累加器数组中投“票”。在一个经典的CHT实现中,候选像素在它们周围的模式中投票,形成一个固定半径的圆。图1a显示了一个位于实际圆(实心圆)和候选像素的经典CHT投票模式(虚线圆)上的候选像素的示例。

    经典的CHT投票模式

    位于圆边缘的候选点的累加器数组投票模式

  2. 中心估计

    属于图像圆的候选像素的投票倾向于在圆中心对应的累加器数组库中累积。因此,通过检测累加器阵列中的峰值来估计圆的圆心。图1b显示了一个位于实际圆(实心圆)上的候选像素(实心点)的示例,以及它们的投票模式(虚线圆),这些模式与实际圆的中心重合。

  3. 半径估计

    如果相同的累加器阵列用于多个半径值,就像在CHT算法中通常做的那样,被检测圆的半径必须作为单独的步骤来估计。

imfindcircles提供在图像中查找圆的两种算法:相位编码(默认)和两阶段算法。两者都有一些共同的计算步骤,但每一个都有自己独特的方面。

两种算法共有的计算特征如下:

  • 二维蓄能器阵列的使用

    经典的霍夫变换需要一个三维阵列来存储多个半径的选票,这导致了较大的存储需求和较长的处理时间。相位编码和两阶段方法都通过对所有半径使用一个二维累加器阵列来解决这个问题。尽管这种方法需要额外的半径估计步骤,但总体计算负载通常较低,特别是在大半径范围内工作时。这是现代CHT实现中广泛采用的实践。

  • 边缘像素的使用

    总体的内存需求和速度很大程度上取决于候选像素的数量。为了限制它们的数量,输入图像的梯度大小被阈值,以便只有高梯度的像素被包含在计票中。

  • 边缘方向信息的使用

    通过限制候选像素可用的箱的数量,还可以优化性能。这是通过使用局部可用的边缘信息来实现的,只允许沿着梯度方向在有限的区间内进行投票(图2)。投票区间的宽度,在点之间c最小值而且c马克斯图中,由定义的半径范围决定r最小值而且r马克斯

    投票方式:多半径,沿梯度方向

    候选像素的允许投票间隔的图形表示。投票间隔的方向垂直于候选点处圆的边缘。

r最小值 最低搜索半径
r马克斯 最大的搜索半径
r实际 候选像素所在圆的半径
c最小值 半径为r的圆心最小值
c马克斯 半径为r的圆心马克斯
c实际 半径为r的圆心实际

两种CHT方法所采用的函数imfindcircles在计算圆半径的方式上有根本的不同。

  • 两级

    利用估计的圆心和图像信息显式地估计半径。该技术是基于计算径向直方图[2][3]

  • Phase-Coding

    从累加器阵列中的复值估计半径,并将半径信息编码在阵列条目的相位中[1].边缘像素投出的选票不仅包含可能的中心位置信息,还包含与中心位置相关的圆的半径信息。与必须使用径向直方图显式估计半径的两阶段方法不同,在相位编码中,可以通过简单地解码来自蓄能器阵列中估计中心位置的相位信息来估计半径。

参考文献

t.j.阿瑟顿,D.J.科尔比森。“大小不变圆检测。”图像与视觉计算.1999年第17卷第11期,第795-803页。

[2]袁国强,j.h。普林,J.伊林沃思和J.基特勒。“Hough变换找圆方法的比较研究”。图像与视觉计算.第8卷,1990年第1期,第71-77页。

[3] E.R.戴维斯机器视觉:理论,算法,实践.第十章。第3版。摩根·考夫曼出版社,2005年。

扩展功能

版本历史

介绍了R2012a

全部展开

Baidu
map