Python影像處理丨三種實現影像形態學轉化運算模式

華為雲開發者聯盟 發表於 2022-07-19
Python
摘要:本篇文章主要講解Python呼叫OpenCV實現影像形態學轉化,包括影像開運算、影像閉運算和梯度運算

本文分享自華為雲社群《[Python影像處理] 九.形態學之影像開運算、閉運算、梯度運算》,作者:eastmount。

數學形態學(Mathematical morphology)是一門建立在格論和拓撲學基礎之上的影像分析學科,是數學形態學影像處理的基本理論。其基本的運算包括:腐蝕和膨脹、開運算和閉運算、骨架抽取、極限腐蝕、擊中擊不中變換、形態學梯度、Top-hat變換、顆粒分析、流域變換等。

本篇文章主要講解Python呼叫OpenCV實現影像形態學轉化,包括影像開運算、影像閉運算和梯度運算,基礎性知識希望對您有所幫助。

  • 1.影像開運算
  • 2.影像閉運算
  • 3.影像梯度運算

一. 影像開運算

1.基本原理

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

開運算(img) = 膨脹( 腐蝕(img) )

Python影像處理丨三種實現影像形態學轉化運算模式

下圖是hanshanbuleng博主提供的開運算效果圖,推薦大家學習他的文章。

https://blog.csdn.net/hanshanbuleng/article/details/80657148

Python影像處理丨三種實現影像形態學轉化運算模式

2.函式原型

影像開運算主要使用的函式morphologyEx,它是形態學擴充套件的一組函式,其引數cv2.MORPH_OPEN對應開運算。其原型如下:

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

引數dst表示處理的結果,src表示原影像,cv2.MORPH_OPEN表示開運算,kernel表示卷積核。下圖表示5*5的卷積核,可以採用函式 np.ones((5,5), np.uint8) 構建。

Python影像處理丨三種實現影像形態學轉化運算模式

執行結果如下圖所示:

Python影像處理丨三種實現影像形態學轉化運算模式

3.程式碼實現

完整程式碼如下所示:

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

#讀取圖片
src = cv2.imread('test01.png', 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()

輸出結果如下圖所示,可以看到噪聲已經被去除了。

Python影像處理丨三種實現影像形態學轉化運算模式

但是結果result中仍然有部分噪聲,如果想去除更徹底將卷積設定為10*10的。

kernel = np.ones((10,10), np.uint8)
result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)

Python影像處理丨三種實現影像形態學轉化運算模式

二. 影像閉運算

1.基本原理

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

閉運算(img) = 腐蝕( 膨脹(img) )

Python影像處理丨三種實現影像形態學轉化運算模式

下圖是hanshanbuleng博主提供的開運算效果圖,推薦大家學習他的文章。

Python影像處理丨三種實現影像形態學轉化運算模式

2.函式原型

影像閉運算主要使用的函式morphologyEx,其原型如下:

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

引數dst表示處理的結果,src表示原影像, cv2.MORPH_CLOSE表示閉運算,kernel表示卷積核。下圖表示5*5的卷積核,可以採用函式 np.ones((5,5), np.uint8) 構建。

Python影像處理丨三種實現影像形態學轉化運算模式

執行結果如下圖所示:

Python影像處理丨三種實現影像形態學轉化運算模式

3.程式碼實現

完整程式碼如下所示:

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

#讀取圖片
src = cv2.imread('test03.png', cv2.IMREAD_UNCHANGED)

#設定卷積核
kernel = np.ones((10,10), np.uint8)

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

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

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

輸出結果如下圖所示,可以看到中間的噪聲去掉。

Python影像處理丨三種實現影像形態學轉化運算模式

三. 影像梯度運算

1.基本原理

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

梯度運算(img) = 膨脹(img) - 腐蝕(img)

Python影像處理丨三種實現影像形態學轉化運算模式

2.函式原型

影像梯度運算主要使用的函式morphologyEx,引數為cv2.MORPH_GRADIENT。其原型如下:

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

引數dst表示處理的結果,src表示原影像, cv2.MORPH_GRADIENT表示梯度運算,kernel表示卷積核。5*5的卷積核可以採用函式 np.ones((5,5), np.uint8) 構建。

執行結果如下圖所示:

Python影像處理丨三種實現影像形態學轉化運算模式

3.程式碼實現

完整程式碼如下所示:

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

#讀取圖片
src = cv2.imread('test04.png', cv2.IMREAD_UNCHANGED)

#設定卷積核
kernel = np.ones((10,10), np.uint8)

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

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

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

輸出結果如下圖所示,可以看到中間的噪聲去掉。

Python影像處理丨三種實現影像形態學轉化運算模式

該系列在github所有原始碼:https://github.com/eastmountyxz/ImageProcessing-Python

本文摘錄自eastmount X華為雲開發者社群聯合出品的電子書《從零到一 • Python影像處理及識別》。點選免費下載電子書《從零到一 • Python影像處理及識別》

 

點選關注,第一時間瞭解華為雲新鮮技術~