OpenCV-Python實(shí)現(xiàn)腐蝕與膨脹的實(shí)例
什么是形態(tài)學(xué)
要了解腐蝕之前,我們需要了解一個(gè)概念:形態(tài)學(xué)。
形態(tài)學(xué),又名數(shù)學(xué)形態(tài)學(xué)(Mathematical Morphology),是圖像處理過程中一個(gè)非常重要的研究方向。形態(tài)學(xué)主要從圖像內(nèi)提取分量信息,該分量信息通常對于表達(dá)和描繪圖像的形狀具有重要的意義,通常是圖像理解時(shí)所使用的最本質(zhì)的形狀特征。
例如,在識別手寫數(shù)字時(shí),能夠通過形態(tài)學(xué)運(yùn)算得到其骨架信息,在具體的識別時(shí),僅針對其骨架進(jìn)行運(yùn)算即可。形態(tài)學(xué)處理在視覺檢測,文字識別,醫(yī)學(xué)圖像處理,圖像壓縮編碼等領(lǐng)域都有非常重要的應(yīng)用。
形態(tài)學(xué)操作主要包含:腐蝕,膨脹,開運(yùn)算,閉運(yùn)算,形態(tài)學(xué)梯度運(yùn)算,頂帽運(yùn)算,黑帽運(yùn)算等操作。腐蝕操作與膨脹操作是形態(tài)學(xué)的運(yùn)算基礎(chǔ),將腐蝕與膨脹結(jié)合,就可以實(shí)現(xiàn)開運(yùn)算,閉運(yùn)算,形態(tài)學(xué)梯度等不同形式的運(yùn)算。
所以本篇博文將重點(diǎn)講解腐蝕與膨脹。
腐蝕
腐蝕是最基本的形態(tài)學(xué)操作之一,它能夠?qū)D像的邊界點(diǎn)消除,使圖像沿著邊界向內(nèi)收縮,也可以將小于指定結(jié)構(gòu)體元素的部分去除。腐蝕主要用來“收縮”或者“細(xì)化”二值圖像中的前景,借此實(shí)現(xiàn)去噪聲,元素分割等功能。
在腐蝕的過程中,通常使用一個(gè)結(jié)構(gòu)元來逐個(gè)像素地掃描要被腐蝕的圖像,并根據(jù)結(jié)構(gòu)元和被腐蝕的圖像的關(guān)系來確定腐蝕結(jié)果。
首先,我們來看一張腐蝕處理圖:
(1)表示要被腐蝕的圖像
(2)結(jié)構(gòu)元
(3)橙色數(shù)字是結(jié)構(gòu)元在遍歷圖像時(shí),結(jié)構(gòu)元完全位于前景對象內(nèi)部時(shí)的3個(gè)全部可能的位置;此時(shí),結(jié)構(gòu)元分別位于img[2,1],img[2,2],img[2,3]處。
(4)腐蝕結(jié)果result,即在結(jié)構(gòu)元完全位于前景圖像中時(shí),將其中心點(diǎn)所對應(yīng)的result中的像素點(diǎn)的值置為1;當(dāng)結(jié)構(gòu)元不完全位于前景圖像中時(shí),將其中心點(diǎn)對應(yīng)的result中的像素點(diǎn)置為0。(按位與)
在OpenCV中,使用函數(shù)cv2.erode()實(shí)現(xiàn)腐蝕操作,其完整定義如下:
def erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None):
src:原始圖像
kernel:結(jié)構(gòu)元,可以自定義,也可以通過函數(shù)cv2.getStructuringElement()生成
iterations:腐蝕操作迭代的次數(shù),默認(rèn)為1,即只進(jìn)行一次操作
至于其他參數(shù)以及取值,前面博文都有介紹,這里不在贅述。
下面,我們使用該函數(shù)來測試一下腐蝕的操作:
import cv2 import numpy as np img = cv2.imread("8.jpg",cv2.IMREAD_UNCHANGED) kernel = np.ones((9,9), np.float32) result = cv2.erode(img,kernel) cv2.imshow("img", img) cv2.imshow("result", result) cv2.waitKey() cv2.destroyAllWindows()
運(yùn)行之后,我們得到的效果對比圖如下:
可以看到,腐蝕操作將原始圖像內(nèi)的毛刺給腐蝕掉了,如果想腐蝕的更嚴(yán)重,可以設(shè)置iterations參數(shù)的值。
膨脹
膨脹與腐蝕正好相反,膨脹能對圖像的邊界進(jìn)行擴(kuò)張。膨脹操作將與當(dāng)前的對象(前景)接觸到的背景點(diǎn)合并到當(dāng)前對象內(nèi),從而實(shí)現(xiàn)將圖像邊界點(diǎn)向外擴(kuò)張。如果圖像內(nèi)的兩個(gè)對象距離較近,可能在膨脹后連接到一起。
膨脹操作對填補(bǔ)圖像分割后圖像內(nèi)所存在的空白相當(dāng)有幫助。同樣的,膨脹也需要一個(gè)結(jié)構(gòu)元進(jìn)行操作。下面,我們還是用矩陣來講解膨脹的原理。
(1)待膨脹的原圖
(2)結(jié)構(gòu)元
(3)橙色部分是結(jié)構(gòu)元遍歷原圖時(shí),結(jié)構(gòu)元中心像素點(diǎn)位于[1,1],img[3,3]時(shí),與前景色存在重合像素點(diǎn)的兩種情況,實(shí)際上共有9個(gè)這樣的與前景對象重合的可能位置。結(jié)構(gòu)元中心分別位于img[1,1],img[1,2],img[1,3],img[2,1],img[2,2],img[2,3],img[3,1],img[3,2],img[3,3]。
(4)膨脹后的結(jié)果圖像result,在結(jié)構(gòu)元內(nèi),當(dāng)任意一個(gè)像素點(diǎn)與前景對象重合時(shí),其中心點(diǎn)所對應(yīng)的膨脹結(jié)果圖像內(nèi)的像素點(diǎn)的值為1;當(dāng)結(jié)構(gòu)元與前景對象完全無重合時(shí),其中心點(diǎn)對應(yīng)的膨脹結(jié)果圖像內(nèi)像素點(diǎn)的值為0。(按位或)
在OpenCV中,它給我們提供cv2.dilate()實(shí)現(xiàn)對圖像的膨脹操作。其完整定義如下:
def dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None):
src:原始圖像
kernel:結(jié)構(gòu)元
其他參數(shù)與前文一致,不在贅述。下面,我們使用該函數(shù)測試膨脹的效果,具體代碼如下所示:
import cv2 import numpy as np img = cv2.imread("8.jpg",cv2.IMREAD_UNCHANGED) kernel = np.ones((9,9), np.float32) result = cv2.dilate(img,kernel) cv2.imshow("img", img) cv2.imshow("result", result) cv2.waitKey() cv2.destroyAllWindows()
運(yùn)行之后,效果如下所示:
可以看到,圖像的頭像膨脹之后與身體連接到了一起,同時(shí)旁邊的線條也被加粗。如果想膨脹的更嚴(yán)重,可以修改iterations參數(shù)的值。
到此這篇關(guān)于OpenCV-Python實(shí)現(xiàn)腐蝕與膨脹的實(shí)例的文章就介紹到這了,更多相關(guān)OpenCV 腐蝕與膨脹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用arrow庫優(yōu)雅地處理時(shí)間數(shù)據(jù)詳解
雖然Python提供了多個(gè)內(nèi)置模塊用于操作日期時(shí)間,但有的時(shí)候并不能滿足我們的需求,所以下面這篇文章主要給大家介紹了關(guān)于Python使用arrow庫如何優(yōu)雅地處理時(shí)間數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10Python實(shí)現(xiàn)深度遍歷和廣度遍歷的方法
今天小編就為大家分享一篇Python實(shí)現(xiàn)深度遍歷和廣度遍歷的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01如何使用Python基于接口編程的方法實(shí)現(xiàn)
本文主要介紹了如何使用Python基于接口編程,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Python入門教程(十七)Python的While循環(huán)
這篇文章主要介紹了Python入門教程(十七)Python的While循環(huán),Python是一門非常強(qiáng)大好用的語言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下2023-04-04Python3 全自動(dòng)更新已安裝的模塊實(shí)現(xiàn)
這篇文章主要介紹了Python3 全自動(dòng)更新已安裝的模塊實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01Python中使用select模塊實(shí)現(xiàn)非阻塞的IO
這篇文章主要介紹了Python中使用select模塊實(shí)現(xiàn)非阻塞的IO,本文使用一個(gè)簡單聊天室程序講解Python中的select模塊使用,需要的朋友可以參考下2015-02-02Python實(shí)現(xiàn)全自動(dòng)安裝第三方庫的方法
這篇文章主要介紹了Python實(shí)現(xiàn)全自動(dòng)安裝第三方庫的方法,一說Python要安裝哪個(gè)模塊,我們第一反應(yīng),win+r輸入cmd,pip?instll安裝,但是如果換電腦了,Python第三方庫那么多,難道要一次一次的敲擊pip?install,本文就介紹一個(gè)簡單的方法解放雙手,需要的朋友可以參考下2023-07-07