[Python影象處理] 九.形態學之影象開運算、閉運算、梯度運算

Eastmount發表於2018-11-02

該系列文章是講解Python OpenCV影象處理知識,前期主要講解影象入門、OpenCV基礎用法,中期講解影象處理的各種演算法,包括影象銳化運算元、影象增強技術、影象分割等,後期結合深度學習研究影象識別、影象分類應用。希望文章對您有所幫助,如果有不足之處,還請海涵~

同時推薦作者的C++影象系列知識:
[數字影象處理] 一.MFC詳解顯示BMP格式圖片
[數字影象處理] 二.MFC單文件分割視窗顯示圖片
[數字影象處理] 三.MFC實現影象灰度、取樣和量化功能詳解
[數字影象處理] 四.MFC對話方塊繪製灰度直方圖
[數字影象處理] 五.MFC影象點運算之灰度線性變化、灰度非線性變化、閾值化和均衡化處理詳解
[數字影象處理] 六.MFC空間幾何變換之影象平移、映象、旋轉、縮放詳解
[數字影象處理] 七.MFC影象增強之影象普通平滑、高斯平滑、Laplacian、Sobel、Prewitt銳化詳解

前文參考:
[Python影象處理] 一.影象處理基礎知識及OpenCV入門函式
[Python影象處理] 二.OpenCV+Numpy庫讀取與修改畫素
[Python影象處理] 三.獲取影象屬性、興趣ROI區域及通道處理
[Python影象處理] 四.影象平滑之均值濾波、方框濾波、高斯濾波及中值濾波
[Python影象處理] 五.影象融合、加法運算及影象型別轉換
[Python影象處理] 六.影象縮放、影象旋轉、影象翻轉與影象平移
[Python影象處理] 七.影象閾值化處理及演算法對比
[Python影象處理] 八.影象腐蝕與影象膨脹

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

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

PS:文章參考自己以前系列影象處理文章及OpenCV庫函式,同時部分參考網易雲lilizong老師的視訊,推薦大家去學習。同時,本篇文章涉及到《計算機圖形學》基礎知識,請大家下來補充。

PSS:2019年1~2月作者參加了CSDN2018年部落格評選,希望您能投出寶貴的一票。我是59號,Eastmount,楊秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index

[Python影象處理] 九.形態學之影象開運算、閉運算、梯度運算
五年來寫了314篇部落格,12個專欄,是真的熱愛分享,熱愛CSDN這個平臺,也想幫助更多的人,專欄包括Python、資料探勘、網路爬蟲、影象處理、C#、Android等。現在也當了兩年老師,更是覺得有義務教好每一個學生,讓貴州學子好好寫點程式碼,學點技術,"師者,傳到授業解惑也",提前祝大家新年快樂。2019我們攜手共進,為愛而生。

一. 影象開運算

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影象處理] 九.形態學之影象開運算、閉運算、梯度運算

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

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影象處理] 九.形態學之影象開運算、閉運算、梯度運算

希望文章對大家有所幫助,如果有錯誤或不足之處,還請海涵。最近經歷的事情太多,有喜有悲,關閉了朋友圈,希望通過不斷學習和寫文章來忘記煩勞,將憂鬱轉換為動力,每週學習都記錄下來,加油!!!
(By:Eastmount 2018-11-02 中午12點 https://blog.csdn.net/Eastmount/)

相關文章