例一:毛刺在往外凸的面上ui
策略1:分割出黑色部分,而后经过开运算去掉毛刺,再经过原黑色部分区域减去开运算以后的区域,获得毛刺部分的区域。 spa
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时,四个尖角被削平了。3d
开运算是先腐蚀再膨胀。腐蚀以后,毛刺被削没了,可是4个尖角大体保持之前的形状;4个尖角再通过膨胀运算后,就变得不尖了。code
策略2:分割出白色部分,而后经过闭运算封闭凹槽,再经过闭运算以后的区域减去原白色部分区域,获得毛刺部分的区域。blog
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)
分割效果很好。ip
例二:毛刺在往内凹的面上ci
策略1:分割出黑色部分,而后经过开运算去掉毛刺,再经过原黑色部分区域减去开运算以后的区域,获得毛刺部分的区域。it
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)
分割效果不佳,现象和缘由同例一。io
策略2:分割出白色部分,而后经过闭运算封闭凹槽,再经过闭运算以后的区域减去原白色部分区域,获得毛刺部分的区域。class
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)
(矩形闭运算后可彻底复原)
(正八边形闭运算后可彻底复原)
叠加在一块儿看看:
(没法复原)
结论:
一、膨胀会使尖角变平滑。
二、对于凸多边形来讲(可用shape_trans (Region, RegionTrans, 'convex')生成凸多边形),腐蚀之后,region的外形特征保持不变,矩形腐蚀之后还是矩形,三角形腐蚀之后仍是三角形。
三、对于非凸多边形来讲,腐蚀之后,region的外形特征大体保持不变,可是若是region的尖角特别细,则会腐蚀掉,这样region的形状就会发生较大变化。
四、圆角腐蚀之后,可能变成尖角。
五、开运算会使尖角变平滑。
六、对于凸多边形来讲,闭运算以后,region不发生任何变化。
七、对于有凹槽的非凸多边形来讲,闭运算以后region的凹槽被填充。第一步膨胀过程当中,夹角变圆角,第二步腐蚀过程当中,圆角又可能复原成了尖角(见第4条)。