1.形態學(Morphology)操作 

形態學主要是從影像中分析分量資訊,該分量對於表達影像特徵有重大意義。常見方式如下:

  • 腐蝕 (erode)
  • 膨脹 (dilate)
  • 開運算 (MORPH_OPEN)
  • 閉運算 (MORPH_CLOSE)
  • 梯度運算 (MORPH_GRADIENT)
  • 禮帽運算 (MORPH_TOPHAT)
  • 黑帽運算 (MORPH_BLACKHAT)

以下將針對各種方法與效果進行說明與展示。


1.1. 腐蝕 (erode)

erosion腐蝕:使影像沿著邊界向內縮收,可實現去雜訊、影像分割等功能。

img_erode = cv2.erode(img, kernel) 

可依需求加入 iterations 參數,ex. iterations=3,則會反覆運算3次。

<source:Greatway9999>


1.2. 膨脹 (dilate)

對影像邊界進行擴張。

img_dilate = cv2.dilate(img, kernel) 

可依需求加入 iterations 參數,ex. iterations=3,則會反覆運算3次。

<source:Greatway9999>


1.3. 開運算 (MORPH_OPEN)

開運算:先腐蝕再膨脹,用於去除邊界雜訊、計數。

img_OPEN = cv2.morphologyEx(img_lena, cv2.MORPH_OPEN, kernel) 

<source:Greatway9999>


1.4. 閉運算 (MORPH_CLOSE)

閉運算:先膨脹再腐蝕,用於去除內部雜訊、影像連接。

img_CLOSE = cv2.morphologyEx(img_lena, cv2.MORPH_CLOSE, kernel)

<source:Greatway9999>


1.5. 梯度運算 (MORPH_GRADIENT)

梯度運算:膨脹影像 - 腐蝕影像,用於取得影像前景的邊緣。

img_GRADIENT = cv2.morphologyEx(img_lena, cv2.MORPH_GRADIENT, kernel)

<source:Greatway9999>


1.6. 禮帽運算 (MORPH_TOPHAT)

禮帽運算:原始影像 - 開運算。用於取得影像雜訊、獲得比原始影像的邊緣更亮的邊緣資訊。

img_TOPHAT = cv2.morphologyEx(img_lena, cv2.MORPH_TOPHAT, kernel)

<source:Greatway9999>


1.7. 黑帽運算 (MORPH_BLACKHAT)

黑帽運算:閉運算影像 - 原始影像。用於取得影像內部小孔、前景色中的小黑點、獲得比原始影像的邊緣更暗的邊緣資訊。

img_BLACKHAT = cv2.morphologyEx(img_lena, cv2.MORPH_BLACKHAT, kernel) 

<source:Greatway9999>


1.8. 自訂特別形狀的kernel

矩形:

kernel_RECT = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))


十字:

kernel_CROSS = cv2.getStructuringElement(cv2.MORPH_CROSS, (5,5)) 


橢圓:

kernel_ELLIPSE = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)) 

1.9. 完整程式

#Morphology


import numpy as np

import cv2

img = cv2.imread('j.png', cv2.IMREAD_GRAYSCALE)

img_lena = cv2.imread('Lenna.jpg', cv2.IMREAD_GRAYSCALE)

kernel = np.ones((5,5), dtype = np.uint8) #kernel size越大,效果越強

#kernel_9 = np.ones((9,9), dtype = np.uint8)


# erosion腐蝕:使影像沿著邊界向內縮收,可實現去雜訊、影像分割等功能

img_erode = cv2.erode(img, kernel) #可依需求加入 iterations 參數,ex. iterations=3,則會反覆運算3次

# img_erode = cv2.erode(img, kernel, iterations=3)

img_erode_9 = cv2.erode(img, kernel_9)

cv2.imshow('img', img)

cv2.imshow('img_erode', img_erode)

#cv2.imshow('img_erode_9', img_erode_9)


# 膨脹:對影像邊界進行擴張。

img_dilate = cv2.dilate(img, kernel) #可依需求加入 iterations 參數,ex. iterations=3,則會反覆運算3次

cv2.imshow('img_dilate', img_dilate)


# 通用形態學函數:將腐蝕與膨脹進行組合操作

img_OPEN = cv2.morphologyEx(img_lena, cv2.MORPH_OPEN, kernel) #開運算:先腐蝕再膨脹,用於去除邊界雜訊、計數。

img_CLOSE = cv2.morphologyEx(img_lena, cv2.MORPH_CLOSE, kernel) #閉運算:先膨脹再腐蝕,用於去除內部雜訊、影像連接。

img_GRADIENT = cv2.morphologyEx(img_lena, cv2.MORPH_GRADIENT, kernel) #梯度運算:膨脹影像 - 腐蝕影像,用於取得影像前景的邊緣。

img_TOPHAT = cv2.morphologyEx(img_lena, cv2.MORPH_TOPHAT, kernel) #禮帽運算:原始影像 - 開運算。用於取得影像雜訊、獲得比原始影像的邊緣更亮的邊緣資訊。

img_BLACKHAT = cv2.morphologyEx(img_lena, cv2.MORPH_BLACKHAT, kernel) #黑帽運算:閉運算影像 - 原始影像。用於取得影像內部小孔、前景色中的小黑點、獲得比原始影像的邊緣更暗的邊緣資訊。


cv2.imshow('img_lena', img_lena)

cv2.imshow('img_OPEN', img_OPEN)

cv2.imshow('img_CLOSE', img_CLOSE)

cv2.imshow('img_GRADIENT', img_GRADIENT)

cv2.imshow('img_TOPHAT', img_TOPHAT)

cv2.imshow('img_BLACKHAT', img_BLACKHAT)


#自訂特別形狀的kernel

'''

kernel_RECT = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) #矩形

kernel_CROSS = cv2.getStructuringElement(cv2.MORPH_CROSS, (5,5)) #十字

kernel_ELLIPSE = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)) #橢圓

'''


cv2.waitKey()

cv2.destroyAllWindows()

---

參考資料:

0 留言