1.膨脹、擴張(Dilation) : 用來銜接(連通)區域。
2.侵蝕(Erosion) : 用來清除雜訊(noise)。
如下圖,像素間的空洞(左圖)經膨脹後被連通起來,使文字能更清晰易辨識(右圖)。
如下圖,經膚色辨識後的圖像掌心有部分破碎(黑色的部分),利用膨脹的技術能夠讓膚色把裡面填滿,但圖像(手指)也因此變粗,可再利用侵蝕的技術讓手指變細回來,若影像有其他雜訊也能一併清除,雖然還是有部分黑色的空洞,但已經比本來的影像品質更好,最後使用中值濾波後,已經可以大幅的感受到手勢被清楚切割出來。
運作原理
侵蝕(Erosion)的定義:
考慮在空間中的兩個集合A 集合和B 集合,當A 集合被B 集合侵蝕,可表示為A⊝B。
A 為輸入影像, B 為結構元素,當輸入像素及其周圍像素相對於結構元素為1的像素值皆為255,則將輸入像素的值設為255。運算結果會使影像看起來收縮,所以此運算稱為侵蝕。侵蝕可以利用適當的結構元素將不必要的元素去除掉。

膨脹(dilation)的定義:
考慮在空間中的兩個集合 A 集合和 B 集合, 當A集合被B 集合膨脹時,可以用A⊕B表示,
A 為輸入影像, B 為結構元素,當輸入像素及其周圍像素相對於結構元素為1的像素值有一個以上為255時,則將輸入像素的值設為255。運算結果會使影像看起來擴大,所以此運算稱為膨脹運算,膨脹的應用是用來做隙縫的填滿,利用適當的結構元素即可將間隙填補起來。

上面介紹的膨脹運算會使影像擴大,侵蝕影像會使影像收縮,這兩個運算子可以組成更重要的形態學運算,開放(Opening)運算及封閉(Closing)運算。
開放運算由侵蝕運算及膨脹運算合成,其公式為:
A。B =(A⊝B)⊕B
它先對結構元素B進行侵蝕運算再進行膨脹運算;先侵蝕運算會將連結弱的區域或小區塊的雜訊先濾除,再經由膨脹後將輪廓便平滑。開放運算會使輪廓平滑,消除較細的部份以及截斷較窄的連結部位。
封閉運算與開放運算相反,其公式為:
A‧B =(A⊕B)⊝B
它先對結構元素B進行膨脹運算再進行侵蝕運算;先膨脹後,區域旁的小雜訊被合再一起,但遠離區域的雜訊仍是孤立狀態,因此再經由侵蝕運算,將遠距離的雜訊侵蝕掉,封閉運算也可使輪廓較為平滑,但與開放運算相反的是,它把窄的中段部分或長的細缺口連結起來,消除小洞、斑點,以及填補輪廓上的缺口。
OpenCV的形態學
侵蝕
erode(const Mat &src, Mat &dst, Mat kernel, Point anchor=Point(-1,-1), int iterations=1)
src:輸入圖,可以多通道,深度可為CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
dst:輸出圖,和輸入圖尺寸、型態相同。
kernel:結構元素,如果kernel=Mat()則為預設的3×3矩形,越大侵蝕效果越明顯。
anchor:原點位置,預設為結構元素的中央。
iterations:執行次數,預設為1次,執行越多次侵蝕效果越明顯。
膨脹
dilate(const Mat &src, Mat &dst, Mat kernel, Point anchor=Point(-1,-1), int iterations=1)
src:輸入圖,可以多通道,深度可為CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
dst:輸出圖,和輸入圖尺寸、型態相同。
kernel:結構元素,如果kernel=Mat()則為預設的3×3矩形,越大膨脹效果越明顯。
anchor:原點位置,預設為結構元素的中央。
iterations:執行次數,預設為1次,執行越多次膨脹效果越明顯。
沒有留言:
張貼留言