例一:毛刺在往外凸的面上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條)。