詳解Python圖像形態(tài)學(xué)處理(開(kāi)運(yùn)算,閉運(yùn)算,梯度運(yùn)算)
這篇文章將繼續(xù)介紹開(kāi)運(yùn)算、閉運(yùn)算和梯度運(yùn)算。數(shù)學(xué)形態(tài)學(xué)(Mathematical Morphology)是一種應(yīng)用于圖像處理和模式識(shí)別領(lǐng)域的新方法。數(shù)學(xué)形態(tài)學(xué)(也稱(chēng)圖像代數(shù))表示以形態(tài)為基礎(chǔ)對(duì)圖像進(jìn)行分析的數(shù)學(xué)工具,其基本思想是用具有一定形態(tài)的結(jié)構(gòu)元素去量度和提取圖像中對(duì)應(yīng)形狀以達(dá)到對(duì)圖像分析和識(shí)別的目的。
一.圖像開(kāi)運(yùn)算
開(kāi)運(yùn)算一般能平滑圖像的輪廓,削弱狹窄部分,去掉較細(xì)的突出。閉運(yùn)算也是平滑圖像的輪廓,與開(kāi)運(yùn)算相反,它一般熔合窄的缺口和細(xì)長(zhǎng)的彎口,去掉小洞,填補(bǔ)輪廓上的縫隙。圖像開(kāi)運(yùn)算是圖像依次經(jīng)過(guò)腐蝕、膨脹處理的過(guò)程,圖像被腐蝕后將去除噪聲,但同時(shí)也壓縮了圖像,接著對(duì)腐蝕過(guò)的圖像進(jìn)行膨脹處理,可以在保留原有圖像的基礎(chǔ)上去除噪聲。其原理如圖1所示。

設(shè)A是原始圖像,B是結(jié)構(gòu)元素圖像,則集合A被結(jié)構(gòu)元素B做開(kāi)運(yùn)算,記為A?B,其定義為:

換句話說(shuō),A被B開(kāi)運(yùn)算就是A被B腐蝕后的結(jié)果再被B膨脹。圖像開(kāi)運(yùn)算在OpenCV中主要使用函數(shù)morphologyEx(),它是形態(tài)學(xué)擴(kuò)展的一組函數(shù),其函數(shù)原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
- src表示原始圖像
- cv2.MORPH_OPEN表示圖像進(jìn)行開(kāi)運(yùn)算處理
- kernel表示卷積核,可以用numpy.ones()函數(shù)構(gòu)建
圖像開(kāi)運(yùn)算的代碼如下所示:
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
#讀取圖片
src = cv2.imread('test01.png', cv2.IMREAD_UNCHANGED)
#設(shè)置卷積核
kernel = np.ones((5,5), np.uint8)
#圖像開(kāi)運(yùn)算
result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出結(jié)果如圖2所示,左邊為原始圖像,右邊為處理后的圖像,可以看到原始圖形中的噪聲點(diǎn)被去除了部分。

但處理后的圖像中仍然有部分噪聲,如果想更徹底地去除,可以將卷積設(shè)置為10×10的模板,代碼如下所示:
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
#讀取圖片
src = cv2.imread('test01.png', cv2.IMREAD_UNCHANGED)
#設(shè)置卷積核
kernel = np.ones((10,10), np.uint8)
#圖像開(kāi)運(yùn)算
result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)
#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()
運(yùn)行結(jié)果如圖3所示:

二.圖像閉運(yùn)算
圖像閉運(yùn)算是圖像依次經(jīng)過(guò)膨脹、腐蝕處理的過(guò)程,先膨脹后腐蝕有助于過(guò)濾前景物體內(nèi)部的小孔或物體上的小黑點(diǎn)。其原理如圖4所示:

設(shè)A是原始圖像,B是結(jié)構(gòu)元素圖像,則集合A被結(jié)構(gòu)元素B做開(kāi)運(yùn)算,記為A·B,其定義為:

換句話說(shuō),A被B閉運(yùn)算就是A被B膨脹后的結(jié)果再被B腐蝕。圖像開(kāi)運(yùn)算在OpenCV中主要使用函數(shù)morphologyEx(),其函數(shù)原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)
- src表示原始圖像
- cv2.MORPH_CLOSE表示圖像進(jìn)行閉運(yùn)算處理
- kernel表示卷積核,可以用numpy.ones()函數(shù)構(gòu)建
圖像閉運(yùn)算的代碼如下所示:
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
#讀取圖片
src = cv2.imread('test02.png', cv2.IMREAD_UNCHANGED)
#設(shè)置卷積核
kernel = np.ones((10,10), np.uint8)
#圖像閉運(yùn)算
result = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)
#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出結(jié)果如圖5所示,它有效地去除了圖像中間的小黑點(diǎn)(噪聲)。

三.圖像梯度運(yùn)算
圖像梯度運(yùn)算是圖像膨脹處理減去圖像腐蝕處理后的結(jié)果,從而得到圖像的輪廓,其原理如圖6所示,(a)表示原始圖像,(b)表示膨脹處理后的圖像,(c)表示腐蝕處理后的圖像,(d)表示圖像梯度運(yùn)算的效果圖。

在Python中,圖像梯度運(yùn)算主要調(diào)用morphologyEx()實(shí)現(xiàn),其中參數(shù)cv2.MORPH_GRADIENT表示梯度處理,函數(shù)原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)
- src表示原始圖像
- cv2.MORPH_GRADIENT表示圖像進(jìn)行梯度運(yùn)算處理
- kernel表示卷積核,可以用numpy.ones()函數(shù)構(gòu)建
圖像梯度運(yùn)算的實(shí)現(xiàn)代碼如下所示。
# -*- coding: utf-8 -*-
import cv2
import numpy as np
#讀取圖片
src = cv2.imread('test03.png', cv2.IMREAD_UNCHANGED)
#設(shè)置卷積核
kernel = np.ones((10,10), np.uint8)
#圖像梯度運(yùn)算
result = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)
#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()
圖像梯度運(yùn)算處理的結(jié)果如圖7所示,左邊為原始圖像,右邊為處理后的效果圖。

四.總結(jié)
本文主要介紹圖像形態(tài)學(xué)處理,詳細(xì)講解了圖像開(kāi)運(yùn)算、閉運(yùn)算和梯度運(yùn)算。數(shù)學(xué)形態(tài)學(xué)是一種應(yīng)用于圖像處理和模式識(shí)別領(lǐng)域的新方法,其基本思想是用具有一定形態(tài)的結(jié)構(gòu)元素去量度和提取圖像中對(duì)應(yīng)形狀以達(dá)到對(duì)圖像分析和識(shí)別目的。
到此這篇關(guān)于詳解Python圖像形態(tài)學(xué)處理(開(kāi)運(yùn)算,閉運(yùn)算,梯度運(yùn)算)的文章就介紹到這了,更多相關(guān)Python圖像形態(tài)學(xué)處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python?基本結(jié)構(gòu)語(yǔ)句(函數(shù)和模塊)
這篇文章主要介紹了python?基本結(jié)構(gòu)語(yǔ)句(函數(shù)和模塊),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
把大數(shù)據(jù)數(shù)字口語(yǔ)化(python與js)兩種實(shí)現(xiàn)
當(dāng)出現(xiàn)萬(wàn)以上的整型數(shù)字時(shí),經(jīng)常要把它們口語(yǔ)化比較直觀。下面分享兩段代碼,python與js的2013-02-02
在RedHat系Linux上部署Python的Celery框架的教程
這篇文章主要介紹了在RedHat系Linux上部署Python的Celery框架的教程, Celery是一個(gè)并行分布框架,擁有良好的I/O性能,需要的朋友可以參考下2015-04-04
python控制結(jié)構(gòu)的條件判斷與循環(huán)示例詳解
這篇文章主要為大家介紹了python控制結(jié)構(gòu)的條件判斷與循環(huán)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
關(guān)于networkx返回圖的鄰接矩陣問(wèn)題
這篇文章主要介紹了關(guān)于networkx返回圖的鄰接矩陣問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Python中處理字符串的相關(guān)的len()方法的使用簡(jiǎn)介
這篇文章主要介紹了Python中處理字符串的相關(guān)的len()方法的使用簡(jiǎn)介,是Python入門(mén)的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05
Python持續(xù)監(jiān)聽(tīng)文件變化代碼實(shí)例
這篇文章主要介紹了Python持續(xù)監(jiān)聽(tīng)文件變化代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
python在windows和linux下獲得本機(jī)本地ip地址方法小結(jié)
這篇文章主要介紹了python在windows和linux下獲得本機(jī)本地ip地址方法,實(shí)例分析了Python獲得IP地址的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03

