從去除毛刺的策略看開運算opening_circle和閉運算closing_circle的異同
從去除毛刺的策略看開運算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條)。
從去除毛刺的策略看開運算opening_circle和閉運算closing_circle的異同