主頁 > 知識庫 > OpenCV-Python實現(xiàn)腐蝕與膨脹的實例

OpenCV-Python實現(xiàn)腐蝕與膨脹的實例

熱門標簽:檢查注冊表項 美圖手機 服務(wù)器配置 鐵路電話系統(tǒng) 網(wǎng)站文章發(fā)布 呼叫中心市場需求 智能手機 銀行業(yè)務(wù)

什么是形態(tài)學(xué)

要了解腐蝕之前,我們需要了解一個概念:形態(tài)學(xué)。

形態(tài)學(xué),又名數(shù)學(xué)形態(tài)學(xué)(Mathematical Morphology),是圖像處理過程中一個非常重要的研究方向。形態(tài)學(xué)主要從圖像內(nèi)提取分量信息,該分量信息通常對于表達和描繪圖像的形狀具有重要的意義,通常是圖像理解時所使用的最本質(zhì)的形狀特征。

例如,在識別手寫數(shù)字時,能夠通過形態(tài)學(xué)運算得到其骨架信息,在具體的識別時,僅針對其骨架進行運算即可。形態(tài)學(xué)處理在視覺檢測,文字識別,醫(yī)學(xué)圖像處理,圖像壓縮編碼等領(lǐng)域都有非常重要的應(yīng)用。

形態(tài)學(xué)操作主要包含:腐蝕,膨脹,開運算,閉運算,形態(tài)學(xué)梯度運算,頂帽運算,黑帽運算等操作。腐蝕操作與膨脹操作是形態(tài)學(xué)的運算基礎(chǔ),將腐蝕與膨脹結(jié)合,就可以實現(xiàn)開運算,閉運算,形態(tài)學(xué)梯度等不同形式的運算。

所以本篇博文將重點講解腐蝕與膨脹。

腐蝕

腐蝕是最基本的形態(tài)學(xué)操作之一,它能夠?qū)D像的邊界點消除,使圖像沿著邊界向內(nèi)收縮,也可以將小于指定結(jié)構(gòu)體元素的部分去除。腐蝕主要用來“收縮”或者“細化”二值圖像中的前景,借此實現(xiàn)去噪聲,元素分割等功能。

在腐蝕的過程中,通常使用一個結(jié)構(gòu)元來逐個像素地掃描要被腐蝕的圖像,并根據(jù)結(jié)構(gòu)元和被腐蝕的圖像的關(guān)系來確定腐蝕結(jié)果。

首先,我們來看一張腐蝕處理圖:


(1)表示要被腐蝕的圖像

(2)結(jié)構(gòu)元

(3)橙色數(shù)字是結(jié)構(gòu)元在遍歷圖像時,結(jié)構(gòu)元完全位于前景對象內(nèi)部時的3個全部可能的位置;此時,結(jié)構(gòu)元分別位于img[2,1],img[2,2],img[2,3]處。

(4)腐蝕結(jié)果result,即在結(jié)構(gòu)元完全位于前景圖像中時,將其中心點所對應(yīng)的result中的像素點的值置為1;當(dāng)結(jié)構(gòu)元不完全位于前景圖像中時,將其中心點對應(yīng)的result中的像素點置為0。(按位與)

在OpenCV中,使用函數(shù)cv2.erode()實現(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ù),默認為1,即只進行一次操作

至于其他參數(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()

運行之后,我們得到的效果對比圖如下:


可以看到,腐蝕操作將原始圖像內(nèi)的毛刺給腐蝕掉了,如果想腐蝕的更嚴重,可以設(shè)置iterations參數(shù)的值。

膨脹

膨脹與腐蝕正好相反,膨脹能對圖像的邊界進行擴張。膨脹操作將與當(dāng)前的對象(前景)接觸到的背景點合并到當(dāng)前對象內(nèi),從而實現(xiàn)將圖像邊界點向外擴張。如果圖像內(nèi)的兩個對象距離較近,可能在膨脹后連接到一起。

膨脹操作對填補圖像分割后圖像內(nèi)所存在的空白相當(dāng)有幫助。同樣的,膨脹也需要一個結(jié)構(gòu)元進行操作。下面,我們還是用矩陣來講解膨脹的原理。


(1)待膨脹的原圖

(2)結(jié)構(gòu)元

(3)橙色部分是結(jié)構(gòu)元遍歷原圖時,結(jié)構(gòu)元中心像素點位于[1,1],img[3,3]時,與前景色存在重合像素點的兩種情況,實際上共有9個這樣的與前景對象重合的可能位置。結(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)任意一個像素點與前景對象重合時,其中心點所對應(yīng)的膨脹結(jié)果圖像內(nèi)的像素點的值為1;當(dāng)結(jié)構(gòu)元與前景對象完全無重合時,其中心點對應(yīng)的膨脹結(jié)果圖像內(nèi)像素點的值為0。(按位或)

在OpenCV中,它給我們提供cv2.dilate()實現(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()

運行之后,效果如下所示:


可以看到,圖像的頭像膨脹之后與身體連接到了一起,同時旁邊的線條也被加粗。如果想膨脹的更嚴重,可以修改iterations參數(shù)的值。

到此這篇關(guān)于OpenCV-Python實現(xiàn)腐蝕與膨脹的實例的文章就介紹到這了,更多相關(guān)OpenCV 腐蝕與膨脹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • OpenCV+python實現(xiàn)膨脹和腐蝕的示例
  • opencv 圖像腐蝕和圖像膨脹的實現(xiàn)

標簽:新疆 樂山 紅河 沈陽 滄州 河南 長治 上海

巨人網(wǎng)絡(luò)通訊聲明:本文標題《OpenCV-Python實現(xiàn)腐蝕與膨脹的實例》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266