在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值很大,这一规律有助于识别出“窄边圆环”。
标签:Circularity,false,WindowHandle,Halcon,区域,Roundness,image From: https://www.cnblogs.com/xh6300/p/18294841