少有人走的路

勇哥的工业自动化技术网站

从去除毛刺的策略看开运算opening_circle和闭运算closing_circle的异同

例一:毛刺在往外凸的面上

image.png

策略1:分割出黑色部分,然后通过开运算去掉毛刺,再通过原黑色部分区域减去开运算之后的区域,得到毛刺部分的区域。

read_image (Tu, 'C:/Users/xiahui/Desktop/tu.jpg')
binary_threshold (Tu, Region, 'max_separability', 'dark', UsedThreshold)
opening_circle (Region, RegionOpening, 50.5)
difference (Region, RegionOpening, RegionDifference)
dev_display (Tu)
dev_display (RegionDifference)

image.png

可以看到,虽然毛刺被分割出来了,但是多出了4块干扰的区域。原因是执行opening_circle时,四个尖角被削平了。

开运算是先腐蚀再膨胀。腐蚀之后,毛刺被削没了,但是4个尖角大致保持以前的形状;4个尖角再经过膨胀运算后,就变得不尖了。

 

策略2:分割出白色部分,然后通过闭运算封闭凹槽,再通过闭运算之后的区域减去原白色部分区域,得到毛刺部分的区域。

read_image (Tu, 'C:/Users/xiahui/Desktop/tu.jpg')
binary_threshold (Tu, Region, 'max_separability', 'light', UsedThreshold)
closing_circle (Region, RegionClosing, 50.5)
difference (RegionClosing, Region, RegionDifference)
dev_display (Tu)
dev_display (RegionDifference)

image.png

分割效果很好。

 

例二:毛刺在往内凹的面上

image.png

策略1:分割出黑色部分,然后通过开运算去掉毛刺,再通过原黑色部分区域减去开运算之后的区域,得到毛刺部分的区域。

read_image (Ao, 'C:/Users/xiahui/Desktop/ao.jpg')
binary_threshold (Ao, Region, 'max_separability', 'dark', UsedThreshold)
opening_circle (Region, RegionOpening, 50.5)
difference (Region, RegionOpening, RegionDifference)
dev_display (Ao)
dev_display (RegionDifference)

分割效果不佳,现象和原因同例一。

 

策略2:分割出白色部分,然后通过闭运算封闭凹槽,再通过闭运算之后的区域减去原白色部分区域,得到毛刺部分的区域。

read_image (Ao, 'C:/Users/xiahui/Desktop/ao.jpg')
binary_threshold (Ao, Region, 'max_separability', 'light', UsedThreshold)
closing_circle (Region, RegionClosing, 50.5)
difference (RegionClosing, Region, RegionDifference)
dev_display (Ao)
dev_display (RegionDifference)

image.png

分割效果很好。

 

说明:

以上的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

 

下面我通过一些简单图形来观察开运算(腐蚀—膨胀)和闭运算(膨胀—腐蚀)的执行效果。

 

用腐蚀、膨胀算子来模拟开运算的过程:

*模拟开运算
set_system ('tsp_clip_region', 'false')
read_image (Rect, 'C:/Users/xiahui/Desktop/Rect.jpg')
binary_threshold (Rect, Region, 'max_separability', 'dark', UsedThreshold)
erosion_circle (Region, RegionErosion, 30.5)
dilation_circle (RegionErosion, RegionDilation, 30.5)
dev_display (Rect)
dev_display (RegionDilation)

image.png

image.png

image.png

(这个星花腐蚀和膨胀值要小些,不然没有上图的效果)

 

 

用膨胀、腐蚀算子来模拟闭运算的过程:

*模拟闭运算
set_system ('tsp_clip_region', 'false')
read_image (Rect, 'C:/Users/xiahui/Desktop/rect.jpg')
binary_threshold (Rect, Region, 'max_separability', 'dark', UsedThreshold)
dilation_circle (Region, RegionDilation, 30.5)
erosion_circle (RegionDilation, RegionErosion, 30.5)
dev_display (Rect)
dev_display (RegionErosion)

image.png

image.png

image.png

结论:

1、膨胀会使尖角变平滑。
2、对于凸多边形来说(可用shape_trans (Region, RegionTrans, 'convex')生成凸多边形),腐蚀以后,region的外形特征保持不变,矩形腐蚀以后仍是矩形,三角形腐蚀以后还是三角形。


3、对于非凸多边形来说,腐蚀以后,region的外形特征大致保持不变,但是如果region的尖角特别细,则会腐蚀掉,这样region的形状就会发生较大变化。


4、圆角腐蚀以后,可能变成尖角。


5、开运算会使尖角变平滑。


6、对于凸多边形来说,闭运算之后,region不发生任何变化。


7、对于有凹槽的非凸多边形来说,闭运算之后region的凹槽被填充。第一步膨胀过程中,夹角变圆角,第二步腐蚀过程中,圆角又可能复原成了尖角(见第4条)。

 

 


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接

Powered By Z-BlogPHP 1.7.3

Copyright www.skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864