數字圖像處理(13): 形態學處理——圖像開運算與圖像閉運算

目錄

1 圖像開運算(先腐蝕,後膨脹)

1.1 基本原理

1.2 代碼示例

2 圖像閉運算(先膨脹,後腐蝕)

2.1 基本原理

2.2 代碼示例

3 圖像梯度運算(膨脹 — 腐蝕)

3.1 基本原理

3.2 代碼示例

參考資料


前面介紹了 形態學處理——圖像腐蝕與圖像膨脹,圖像膨脹會擴大一幅圖像的組成部分,而圖像腐蝕會縮小一幅圖像的組成部分。下面將繼續介紹形態學處理中的開操作和閉操作。

開操作一般會平滑物體的輪廓、斷開較窄的狹頸並消除細的突出物。

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

 

1 圖像開運算(先腐蝕,後膨脹)

1.1 基本原理

圖像開運算是圖像依次經過腐蝕、膨脹處理後的過程。圖像被腐蝕後,去除了噪聲,但是也壓縮了圖像;接着對腐蝕過的圖像進行膨脹處理,可以去除噪聲,並保留原有圖像。如下圖所示:

開運算:先腐蝕,後膨脹

 

下圖借鑑是一篇博客寫的開運算效果圖:

 

1.2 代碼示例

圖像開運算使用函數 morphologyEx() ,它是形態學擴展的一組函數,其參數cv2.MORPH_OPEN對應開運算

morphologyEx() 函數形式如下:

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

其中,參數:

dst 表示處理的結果;

src 表示原始圖像;

cv2.MORPH_OPEN 表示開運算;

kernel 表示卷積核。

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

 

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

代碼如下所示:

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

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

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

#圖像開運算
result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)

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

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

 

運行結果如下圖所示:

由上面結果可以看到,仍然有噪聲存在,可以將增大卷積核的大小。

 

(2)卷積核大小爲25\times25 

代碼如下所示:

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

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

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

#圖像開運算
result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)

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

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

 

運行結果如下圖所示:

 


 

2 圖像閉運算(先膨脹,後腐蝕)

2.1 基本原理

圖像閉運算是圖像依次經過膨脹、腐蝕處理後的過程。圖像先膨脹,後腐蝕,它有助於關閉前景物體內部的小孔,或物體上的小黑點。如下圖所示:

閉運算:先膨脹,後腐蝕

 

下圖借鑑是一篇博客寫的開運算效果圖:

 

 

2.2 代碼示例

圖像閉運算使用函數 morphologyEx() , 它是形態學擴展的一組函數,其參數 cv2.MORPH_CLOSE 對應閉運算

morphologyEx() 函數形式如下:

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

其中,參數:

dst 表示處理的結果;

src 表示原圖像;

cv2.MORPH_CLOSE 表示閉運算;

kernel表示卷積核。

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

 

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

代碼如下所示:

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

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

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

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

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

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

 

運行結果如下圖所示:

由上面結果可以看到,噪聲仍有一處存在,可以將增大卷積核的大小。

 

(2)卷積核大小爲 7\times

代碼如下所示:

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

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

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

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

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

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

 

運行結果如下圖所示:

 


 

3 圖像梯度運算(膨脹 — 腐蝕)

3.1 基本原理

圖像梯度運算是膨脹圖像減去腐蝕圖像的結果,得到圖像的輪廓,其中二值圖像1表示白色點,0表示黑色點。 如下圖所示:

梯度運算:膨脹圖像 — 腐蝕圖像

 

3.2 代碼示例

圖像梯度運算使用的函數 morphologyEx(),其參數 cv2.MORPH_GRADIENT 對應 梯度運算

morphologyEx() 函數形式如下:

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

其中,參數:

dst表示處理的結果;,

src表示原圖像;,

cv2.MORPH_GRADIENT表示梯度運算;,

kernel表示卷積核。

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

 

代碼如下所示:

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

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

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

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

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

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

 

運行結果如下圖所示:

 


 

參考資料

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

[2] https://blog.csdn.net/hanshanbuleng/article/details/80657148

[3] Python+OpenCV圖像處理

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