在Halcon中,区域的特征Roundness(圆度)和Circularity(圆度)虽然都用于描述区域与圆形之间的相似程度,但它们在计算方法和应用上存在一些区别。还是从帮助文档着手:
1、Roundness(圆度)
机翻:
- 计算方法:Roundness通常通过计算区域轮廓上各点到区域中心的平均距离(Distance)与这些距离的标准差(Sigma)之间的关系来得到。这种计算方法更多地考虑了轮廓点到中心的分布情况(即侧重于轮廓的均匀性),从而评估区域形状的圆形程度;Roundness值越接近1,表示区域的形状越接近圆形。
帮助文档中还列举出了计算公式,但是比较复杂,难以用Halcon脚本来复现:
虽然搞不太清楚,但是没有关系,我研究以后发现特征筛选中使用“Circularity”来筛选,可能更符合常见项目的筛选目的。
2、Circularity(圆度)
- 计算方法:Circularity通常是通过区域的面积(F)和近似最小外接圆的面积的比值来计算。Circularity值越接近1,表示区域的形状越接近圆形。
帮助文档中描述了它的计算方法:
上图公式中,max是区域中心点到轮廓所有像素的最大距离,所以(max^2 * π)差不多近似等于区域最小外接圆的面积。
写了这么多,其实还是不太容易看出Roundness和Circularity在应用中的区别,我写一个脚本程序让大家直观地看出这2个特征的差异:
1 dev_set_draw ('margin')
2 dev_set_line_width (1)
3 dev_get_window (WindowHandle)
4 set_display_font (WindowHandle, 15, 'Courier', 'true', 'false')
5
6 read_image (Image, '各种图形.png')
7 threshold (Image, Region, 0, 55)
8 opening_circle (Region, RegionOpening, 1) //去掉可能的毛刺
9 connection (RegionOpening, ConnectedRegions)
10 *将多个轮廓按“column”从左到右排列
11 sort_region (ConnectedRegions, SortedRegions, 'first_point', 'true', 'column')
12
13 *获得Roundness、Circularity属性值
14 roundness (SortedRegions, Distance, Sigma, Roundness, Sides)
15 circularity (SortedRegions, Circularity)
16
17 dev_display (Image)
18 disp_message (WindowHandle, 'Roundness:', 'image', 30, 5, 'red', 'false')
19 disp_message (WindowHandle, 'Circularity:', 'image', 90, 5, 'red', 'false')
20 disp_message (WindowHandle, '计算近似值:', 'image', 120, 5, 'black', 'false')
21
22
23 for i := 0 to |Roundness|-1 by 1
24 *两值差异>30%的,用蓝色字显示
25 bili := abs(Roundness[i] - Circularity[i]) / max2(Roundness[i] , Circularity[i])
26 if (bili > 0.3)
27 color := 'blue'
28 else
29 color := 'black'
30 endif
31 disp_message (WindowHandle, Roundness[i] $'.2f', 'image', 30, 168 + 104 * i, color, 'false')
32 disp_message (WindowHandle, Circularity[i] $'.2f', 'image', 90, 168 + 104 * i, color, 'false')
33
34 select_obj (SortedRegions, CurrentRoi, i + 1)
35 gen_contour_region_xld (CurrentRoi, Contours, 'border')
36 area_center (CurrentRoi, Area, Row, Column)
37 distance_pc (Contours, Row, Column, DistanceMin, DistanceMax)
38
39 * 公式:C1 = F / (max * max * π)
40 C1 := Area /(DistanceMax * DistanceMax * 3.14159)
41 C := min2(1, C1)
42
43 disp_message (WindowHandle, '(' + C $'.2f' + ')', 'image', 125, 159 + 104 * i, color, 'false')
44 endfor
上图可以看出,用公式“C1 = F / (max * max * π)”计算出的Circularity值(C1),与算子“circularity (SortedRegions, Circularity)”得出的值基本相同。也就验证了该公式的解读是正确的。
同时可以得出结论:
① 缺陷检测项目使用blob分析时,如果想用圆度来筛选圆形的斑点,使用特征Circularity显然更加合理;
② 至于Roundness特征,当区域是“正方形、窄边圆环、N角星”时,Roundness都很接近1,但是它们显然不像“圆形斑点”;
③ “窄边圆环”的Circularity值很小、Roundness值很大,这一规律有助于识别出“窄边圆环”。
--------------------------------------------
本文系原创,转载请注明出处。
如果文章对您有帮助,可以点击下方的【好文要顶】或【关注我】;如果您想进一步表示感谢,可通过网页右侧的【打赏】功能进行打赏。
感谢您的支持,我会继续写出更多的相关文章!文章有不理解的地方欢迎跟帖交流,博主经常在线!^_^