摘要:本文主要介紹影像形態學處理,詳細講解了影像開運算、閉運算和梯度運算,數學形態學是一種應用于影像處理和模式識別領域的新方法,其基本思想是用具有一定形態的結構元素去量度和提取影像中對應形狀以達到對影像分析和識別目的,
本文分享自華為云社區《[Python從零到壹] 四十八.影像增強及運算篇之形態學開運算、閉運算和梯度運算》,作者: eastmount ,
本文主要介紹影像形態學處理,詳細講解了影像開運算、閉運算和梯度運算,數學形態學是一種應用于影像處理和模式識別領域的新方法,其基本思想是用具有一定形態的結構元素去量度和提取影像中對應形狀以達到對影像分析和識別目的,
一.影像開運算
開運算一般能平滑影像的輪廓,削弱狹窄部分,去掉較細的突出,閉運算也是平滑影像的輪廓,與開運算相反,它一般熔合窄的缺口和細長的彎口,去掉小洞,填補輪廓上的縫隙,影像開運算是影像依次經過腐蝕、膨脹處理的程序,影像被腐蝕后將去除噪聲,但同時也壓縮了影像,接著對腐蝕過的影像進行膨脹處理,可以在保留原有影像的基礎上去除噪聲,其原理如圖1所示,
設A是原始影像,B是結構元素影像,則集合A被結構元素B做開運算,記為A?B,其定義為:
換句話說,A被B開運算就是A被B腐蝕后的結果再被B膨脹,影像開運算在OpenCV中主要使用函式morphologyEx(),它是形態學擴展的一組函式,其函式原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
- src表示原始影像
- cv2.MORPH_OPEN表示影像進行開運算處理
- kernel表示卷積核,可以用numpy.ones()函式構建
影像開運算的代碼如下所示:
# -*- coding: utf-8 -*- # By:Eastmount 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()
輸出結果如圖2所示,左邊為原始影像,右邊為處理后的影像,可以看到原始圖形中的噪聲點被去除了部分,
但處理后的影像中仍然有部分噪聲,如果想更徹底地去除,可以將卷積設定為10×10的模板,代碼如下所示:
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np #讀取圖片 src = cv2.imread('test01.png', cv2.IMREAD_UNCHANGED) #設定卷積核 kernel = np.ones((10,10), np.uint8) #影像開運算 result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel) #顯示影像 cv2.imshow("src", src) cv2.imshow("result", result) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
運行結果如圖3所示:
二.影像閉運算
影像閉運算是影像依次經過膨脹、腐蝕處理的程序,先膨脹后腐蝕有助于過濾前景物體內部的小孔或物體上的小黑點,其原理如圖4所示:
設A是原始影像,B是結構元素影像,則集合A被結構元素B做開運算,記為A·B,其定義為:
換句話說,A被B閉運算就是A被B膨脹后的結果再被B腐蝕,影像開運算在OpenCV中主要使用函式morphologyEx(),其函式原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)
- src表示原始影像
- cv2.MORPH_CLOSE表示影像進行閉運算處理
- kernel表示卷積核,可以用numpy.ones()函式構建
影像開運算的代碼如下所示:
# -*- coding: utf-8 -*- # By:Eastmount import cv2 import numpy as np #讀取圖片 src = cv2.imread('test02.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()
輸出結果如圖5所示,它有效地去除了影像中間的小黑點(噪聲),
三.影像梯度運算
影像梯度運算是影像膨脹處理減去影像腐蝕處理后的結果,從而得到影像的輪廓,其原理如圖6所示,(a)表示原始影像,(b)表示膨脹處理后的影像,(c)表示腐蝕處理后的影像,(d)表示影像梯度運算的效果圖,
在Python中,影像梯度運算主要呼叫morphologyEx()實作,其中引數cv2.MORPH_GRADIENT表示梯度處理,函式原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)
- src表示原始影像
- cv2.MORPH_GRADIENT表示影像進行梯度運算處理
- kernel表示卷積核,可以用numpy.ones()函式構建
影像梯度運算的實作代碼如下所示,
# -*- coding: 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_GRADIENT, kernel) #顯示影像 cv2.imshow("src", src) cv2.imshow("result", result) #等待顯示 cv2.waitKey(0) cv2.destroyAllWindows()
影像梯度運算處理的結果如圖7所示,左邊為原始影像,右邊為處理后的效果圖,
四.總結
本文主要介紹影像形態學處理,詳細講解了影像開運算、閉運算和梯度運算,數學形態學是一種應用于影像處理和模式識別領域的新方法,其基本思想是用具有一定形態的結構元素去量度和提取影像中對應形狀以達到對影像分析和識別目的,
參考文獻:
- [1]岡薩雷斯著,阮秋琦譯. 數字影像處理(第3版)[M]. 北京:電子工業出版社,2013.
- [2]阮秋琦. 數字影像處理學(第3版)[M]. 北京:電子工業出版社,2008.
- [3]毛星云,冷雪飛. OpenCV3編程入門[M]. 北京:電子工業出版社,2015.
- [4]Eastmount. [Python影像處理] 八.影像腐蝕與影像膨脹[EB/OL]. (2018-10-31). https://blog.csdn.net/Eastmount/article/details/83581277.
點擊關注,第一時間了解華為云新鮮技術~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/543502.html
標籤:Python
