數字圖像處理(14): 形態學處理——圖像頂帽運算和黑帽運算

目錄

1 圖像頂帽運算(原始圖像 — 開運算)

1.1 基本原理

1.2 代碼示例

2 圖像黑帽運算(閉運算 — 原始圖像)

2.1 基本原理

2.2 代碼示例

參考資料


前面介紹了 形態學處理——圖像開運算與圖像閉運算,其中:

圖像開運算先腐蝕,後膨脹。一般會平滑物體的輪廓、斷開較窄的狹頸並消除細的突出物。

圖像閉運算先膨脹,後腐蝕。同樣也會平滑輪廓的一部分。但與開操作相反,它通常會彌合較窄的間斷和細長的溝壑,消除小的孔洞,填補輪廓線中的斷裂。

 

1 圖像頂帽運算(原始圖像 — 開運算)

1.1 基本原理

圖像頂帽(或圖像禮帽)運算是原始圖像減去圖像開運算的結果,得到圖像的噪聲。如下圖所示:

頂帽運算:原始圖像 — 圖像開運算

 

 

1.2 代碼示例

圖像頂帽運算使用函數 morphologyEx() ,其參數 cv2.MORPH_TOPHAT 對應頂帽運算。

morphologyEx() 函數形式如下:

dst = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

其中,參數:

dst 表示處理的結果;

src 表示原圖像;

cv2.MORPH_TOPHAT 表示頂帽運算;

kernel 表示卷積核。

例如,下圖表示 5\times5 的卷積核,可以採用函數 np.ones((5,5), np.uint8) 構建。

 

(1)卷積核大小爲 5\times

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np

#讀取圖片
src = cv2.imread('test5.bmp', cv2.IMREAD_UNCHANGED)

#設置卷積核
kernel = np.ones((5,5), np.uint8)

#圖像閉運算
result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下圖所示:

 

(2)卷積核大小爲 15\times15 

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np

#讀取圖片
src = cv2.imread('test5.bmp', cv2.IMREAD_UNCHANGED)

#設置卷積核
kernel = np.ones((15,15), np.uint8)

#圖像閉運算
result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下圖所示:


 

2 圖像黑帽運算(閉運算 — 原始圖像)

2.1 基本原理

圖像黑帽運算是圖像閉運算操作減去原始圖像的結果,得到圖像內部的小孔,或者前景色中的小黑點。如下圖所示:

黑帽運算:閉運算 — 原始圖像

 

2.2 代碼示例

圖像黑帽運算使用函數 morphologyEx() ,其參數 cv2.MORPH_BLACKHAT 對應黑帽運算。

morphologyEx() 函數形式如下:

dst = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

其中,參數:

dst 表示處理的結果;

src 表示原圖像;

cv2.MORPH_BLACKHAT 表示黑帽運算;

kernel 表示卷積核。

例如,下圖表示 5\times5 的卷積核,可以採用函數 np.ones((5,5), np.uint8) 構建。

 

(1)卷積核大小爲 5\times5

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np

#讀取圖片
src = cv2.imread('test6.bmp', cv2.IMREAD_UNCHANGED)

#設置卷積核
kernel = np.ones((5,5), np.uint8)

#圖像閉運算
result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下圖所示:

 

 

(2)卷積核大小爲 15\times15

代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np

#讀取圖片
src = cv2.imread('test6.bmp', cv2.IMREAD_UNCHANGED)

#設置卷積核
kernel = np.ones((15,15), np.uint8)

#圖像閉運算
result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

 

運行結果如下圖所示:

 


 

參考資料

[1] https://blog.csdn.net/Eastmount/article/details/83692456

[2] Python+OpenCV圖像處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章