[OpenCV筆記] 6. 形態學操作
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 留言