从去除毛刺的策略看开运算opening_circle和闭运算closing_circle的异同
例一:毛刺在往外凸的面上
策略1:分割出黑色部分,然后通过开运算去掉毛刺,再通过原黑色部分区域减去开运算之后的区域,得到毛刺部分的区域。
1 read_image (Tu, 'C:/Users/xiahui/Desktop/tu.jpg') 2 binary_threshold (Tu, Region, 'max_separability', 'dark', UsedThreshold) 3 opening_circle (Region, RegionOpening, 50.5) 4 difference (Region, RegionOpening, RegionDifference) 5 dev_display (Tu) 6 dev_display (RegionDifference)
可以看到,虽然毛刺被分割出来了,但是多出了4块干扰的区域。原因是执行opening_circle时,四个尖角被削平了。
开运算是先腐蚀再膨胀。腐蚀之后,毛刺被削没了,但是4个尖角大致保持以前的形状;4个尖角再经过膨胀运算后,就变得不尖了。
策略2:分割出白色部分,然后通过闭运算封闭凹槽,再通过闭运算之后的区域减去原白色部分区域,得到毛刺部分的区域。
1 read_image (Tu, 'C:/Users/xiahui/Desktop/tu.jpg') 2 binary_threshold (Tu, Region, 'max_separability', 'light', UsedThreshold) 3 closing_circle (Region, RegionClosing, 50.5) 4 difference (RegionClosing, Region, RegionDifference) 5 dev_display (Tu) 6 dev_display (RegionDifference)
分割效果很好。
例二:毛刺在往内凹的面上
策略1:分割出黑色部分,然后通过开运算去掉毛刺,再通过原黑色部分区域减去开运算之后的区域,得到毛刺部分的区域。
1 read_image (Ao, 'C:/Users/xiahui/Desktop/ao.jpg') 2 binary_threshold (Ao, Region, 'max_separability', 'dark', UsedThreshold) 3 opening_circle (Region, RegionOpening, 50.5) 4 difference (Region, RegionOpening, RegionDifference) 5 dev_display (Ao) 6 dev_display (RegionDifference)
分割效果不佳,现象和原因同例一。
策略2:分割出白色部分,然后通过闭运算封闭凹槽,再通过闭运算之后的区域减去原白色部分区域,得到毛刺部分的区域。
1 read_image (Ao, 'C:/Users/xiahui/Desktop/ao.jpg') 2 binary_threshold (Ao, Region, 'max_separability', 'light', UsedThreshold) 3 closing_circle (Region, RegionClosing, 50.5) 4 difference (RegionClosing, Region, RegionDifference) 5 dev_display (Ao) 6 dev_display (RegionDifference)
分割效果很好。
说明:
以上的opening_circle (Region, RegionOpening, 50.5)可以用下面的代码来完全等效:
set_system ('tsp_clip_region', 'false') erosion_circle (Region, RegionErosion1, 50.5) dilation_circle (RegionErosion1, RegionDilation, 50.5)
(set_system ('tsp_clip_region', 'false')的意思是当region(一般是膨胀以后)超过图像区域时,不修剪region)
下面我通过一些简单图形来观察开运算(腐蚀—膨胀)和闭运算(膨胀—腐蚀)的执行效果。
用腐蚀、膨胀算子来模拟开运算的过程:
1 *模拟开运算 2 set_system ('tsp_clip_region', 'false') 3 read_image (Rect, 'C:/Users/xiahui/Desktop/Rect.jpg') 4 binary_threshold (Rect, Region, 'max_separability', 'dark', UsedThreshold) 5 erosion_circle (Region, RegionErosion, 30.5) 6 dilation_circle (RegionErosion, RegionDilation, 30.5) 7 dev_display (Rect) 8 dev_display (RegionDilation)
(这个星花腐蚀和膨胀值要小些,不然没有上图的效果)
用膨胀、腐蚀算子来模拟闭运算的过程:
1 *模拟闭运算 2 set_system ('tsp_clip_region', 'false') 3 read_image (Rect, 'C:/Users/xiahui/Desktop/rect.jpg') 4 binary_threshold (Rect, Region, 'max_separability', 'dark', UsedThreshold) 5 dilation_circle (Region, RegionDilation, 30.5) 6 erosion_circle (RegionDilation, RegionErosion, 30.5) 7 dev_display (Rect) 8 dev_display (RegionErosion)
(矩形闭运算后可完全复原)
(正八边形闭运算后可完全复原)
叠加在一起看看:
(无法复原)
结论:
1、膨胀会使尖角变平滑。
2、对于凸多边形来说(可用shape_trans (Region, RegionTrans, 'convex')生成凸多边形),腐蚀以后,region的外形特征保持不变,矩形腐蚀以后仍是矩形,三角形腐蚀以后还是三角形。
3、对于非凸多边形来说,腐蚀以后,region的外形特征大致保持不变,但是如果region的尖角特别细,则会腐蚀掉,这样region的形状就会发生较大变化。
4、圆角腐蚀以后,可能变成尖角。
5、开运算会使尖角变平滑。
6、对于凸多边形来说,闭运算之后,region不发生任何变化。
7、对于有凹槽的非凸多边形来说,闭运算之后region的凹槽被填充。第一步膨胀过程中,夹角变圆角,第二步腐蚀过程中,圆角又可能复原成了尖角(见第4条)。