在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值很大,这一规律有助于识别出“窄边圆环”。

 

posted on 2024-07-10 19:15  xh6300  阅读(31)  评论(0编辑  收藏  举报