检测和测量圆形对象在一个图像
这个例子展示了如何自动检测圆形或圆形对象在一个图像和可视化检测。
步骤1:加载图像
读取和显示图像的圆形塑料芯片的各种颜色。除了有大量的圈子去检测,有一些有趣的事情在这幅图像从一个圆检测的观点来看:
有芯片的不同颜色,不同背景与尊重。一端,蓝色和红色的有强烈的对比背景。另一方面,一些黄色的芯片不与背景形成鲜明对比。
注意一些芯片的其他和其他一些彼此靠的很近,几乎碰。重叠的对象边界和对象阻塞对象检测通常是具有挑战性的场景。
rgb = imread (“coloredChips.png”);imshow (rgb)
步骤2:确定半径范围搜索
找到适当的圆圈的半径范围使用画直线
函数。画一条线近似直径的芯片。
d =画直线;
线的长度直径的ROI是芯片。典型的芯片有直径在40到50像素。
pos = d.Position;diffPos = diff (pos);diffPos直径=函数(diffPos (1), (2))
直径= 45.3448
步骤3:最初试图找到圆
的imfindcircles
函数搜索圆的半径范围。寻找圆的半径20至25像素的范围。之前,这是一个很好的实践要求的对象是否比背景颜色更浅或者更深。要回答这个问题,看这张图片的灰度版本。
gray_image = rgb2gray (rgb);imshow (gray_image)
背景很明亮和大部分的芯片比背景更暗。但是,默认情况下,imfindcircles
发现循环比背景的对象。因此,设置参数“ObjectPolarity”“黑暗”imfindcircles
寻找黑眼圈。
(中心、半径)= imfindcircles (rgb, 25 [20],“ObjectPolarity”,“黑暗”)
中心=[]半径= []
注意,输出中心
和半径
是空的,这意味着没有圈子里被发现。这经常发生,因为imfindcircles
是一个圆探测器,类似于大多数探测器,imfindcircles
有一个内部检测阈值这决定了它的灵敏度。简单来说这意味着探测器在一定的信心(圆)检测必须大于一定程度才被认为是有效的检测。imfindcircles
有一个参数的敏感性,可用于控制这种内部阈值,因此,算法的灵敏度。高灵敏度的值设置检测阈值低,导致检测更多的圈。这类似于运动探测器的灵敏度控制用于家庭安全系统。
步骤4:增加检测灵敏度
回到芯片图像,可能在默认的敏感性水平圆都低于内部阈值,这就是为什么未发现圈子。默认情况下,“敏感性”,这是一个在0和1之间,设置为0.85。0.9增加“敏感性”。
(中心、半径)= imfindcircles (rgb, 25 [20],“ObjectPolarity”,“黑暗”,…“敏感”,0.9)
中心=8×2146.1895 198.5824 328.8132 135.5883 130.3134 43.8039 175.2698 297.0583 312.2831 192.3709 327.1316 297.0077 243.9893 166.4538 271.5873 280.8920
半径=8×123.1604 22.5710 22.9576 23.7356 22.9551 22.9995 22.9055 23.0298
这一次imfindcircles
发现某些圈子里——八是精确的。中心
包含圆中心的位置半径
包含这些圆圈的半径估计。
第五步:画出圆圈的形象
这个函数viscircles
可以用来画圆的形象。输出变量中心
和半径
从imfindcircles
可以直接传递给viscircles
。
imshow (rgb) h = viscircles(中心、半径);
圆中心看起来似乎正确定位和相应的半径匹配实际的芯片。但仍然相当多的芯片都错过了。试着增加“敏感性”,至0.92。
(中心、半径)= imfindcircles (rgb, 25 [20],“ObjectPolarity”,“黑暗”,…“敏感”,0.92);长度(中心)
ans = 16
所以增加“灵敏度”让我们更圆。这些圆圈形象再次的阴谋。
删除(h)%删除先前画圆圈h = viscircles(中心、半径);
步骤6:使用第二种方法(两级)寻找
这个结果看起来更好。imfindcircles
有两个不同的方法寻找圈。目前默认的方法,称为相位编码方法,用于探测圈。还有一个方法,通常称为两级方法,可用imfindcircles
。使用两阶段方法并显示结果。
(中心、半径)= imfindcircles (rgb, 25 [20],“ObjectPolarity”,“黑暗”,…“敏感”,0.92,“方法”,“二级”);删除(h) h = viscircles(中心、半径);
两阶段方法检测更多的圈,0.92的敏感性。一般来说,这两种方法是互补的,它们有不同的优势。相位编码方法通常是更快和更健壮的噪音比两阶段的方法。但这也可能需要更高的“敏感性”水平得到相同数量的检测两阶段方法。例如,相位编码方法还发现同一芯片如果“灵敏度”级别高,说到0.95。
(中心、半径)= imfindcircles (rgb, 25 [20],“ObjectPolarity”,“黑暗”,…“敏感”,0.95);删除(h) viscircles(中心、半径);
请注意,这两个方法imfindcircles
发现部分可见的中心和半径(堵塞)芯片准确。
第七步:为什么有人仍然错过了?
看最后的结果,很奇怪imfindcircles
没有找到黄色的芯片图像中。黄色的芯片没有强烈的对比与背景。事实上,他们似乎非常相似的强度为背景。有没有可能黄色芯片并不是真正的“黑暗”的假定是背景?确认,显示这个图像的灰度版本了。
imshow (gray_image)
第八步:找到“明亮”圈子里的形象
黄色的芯片几乎相同的强度,甚至更亮,而背景。因此,检测黄芯片,“ObjectPolarity”更改为“光明”。
[centersBright, radiiBright] = imfindcircles (rgb, 25 [20],…“ObjectPolarity”,“光明”,“敏感”,0.92);
步骤9:“明亮”圈中有不同的颜色
画出明亮的圈在一个不同的颜色,通过改变参数“颜色”viscircles
。
imshow (rgb) hBright = viscircles (centersBright radiiBright,“颜色”,“b”);
注意三个失踪的黄色晶片被发现,但有一个黄色的芯片是失踪。这些黄色的芯片是很难找到,因为他们不喜欢脱颖而出以及其他在这个背景。
第十步:降低“EdgeThreshold”的价值
还有一个参数imfindcircles
这可能是有用的,即“EdgeThreshold”。找到圈子,imfindcircles
只使用图像中的边缘像素。这些边缘像素是像素高梯度值。EdgeThreshold的参数控制高像素的梯度值必须是之前被认为是边缘像素和包含在计算。高价值(接近1)为这个参数将允许只有强者包括边缘(高梯度值),而一个低价值(接近0)更宽容,甚至包括较弱的边缘(低梯度值)的计算。失踪的黄色的芯片,因为对比很低,一些边界像素(芯片)的周长预计低梯度值。因此,降低“EdgeThreshold”参数,以确保最边缘像素的黄色芯片都包含在计算。
[centersBright, radiiBright metricBright] = imfindcircles (rgb, 25 [20],…“ObjectPolarity”,“光明”,“敏感”,0.92,“EdgeThreshold”,0.1);删除(hBright) hBright = viscircles (centersBright radiiBright,“颜色”,“b”);
步骤11:画“黑暗”和“光明”圈在一起
现在imfindcircles
发现所有的黄色的,绿色的。蓝色画这些芯片,加上早些时候发现的其他芯片(“ObjectPolarity”设置为“黑暗”),红色的。
h = viscircles(中心、半径);
检测到所有的圈子。最后一个词——值得注意的是,更积极地改变参数检测可能会发现更多的圈子,但也增加了检测假圈的可能性。之间有一个权衡可以找到真正的圆的数量(检出率)和假圈的数量被发现与他们(误警率)。
圆狩猎快乐!