(轉) 開運算opening_circle和閉運算closing_circle的異同

從去除毛刺的策略看開運算opening_circle和閉運算closing_circle的異同

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

策略1:分割出黑色部分,而後經過開運算去掉毛刺,再經過原黑色部分區域減去開運算以後的區域,獲得毛刺部分的區域。 post

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時,四個尖角被削平了。ui

開運算是先腐蝕再膨脹。腐蝕以後,毛刺被削沒了,可是4個尖角大體保持之前的形狀;4個尖角再通過膨脹運算後,就變得不尖了。this

 

策略2:分割出白色部分,而後經過閉運算封閉凹槽,再經過閉運算以後的區域減去原白色部分區域,獲得毛刺部分的區域。url

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)

分割效果很好。spa

 

例二:毛刺在往內凹的面上3d

 

策略1:分割出黑色部分,而後經過開運算去掉毛刺,再經過原黑色部分區域減去開運算以後的區域,獲得毛刺部分的區域。code

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)

分割效果不佳,現象和緣由同例一。htm

 

策略2:分割出白色部分,而後經過閉運算封閉凹槽,再經過閉運算以後的區域減去原白色部分區域,獲得毛刺部分的區域。blog

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條)。

相關文章
相關標籤/搜索