形態(tài)學(xué),即數(shù)學(xué)形態(tài)學(xué)(Mathematical Morphology),是圖像處理過程中一個(gè)非常重要的研 究方向。形態(tài)學(xué)主要從圖像內(nèi)提取分量信息,該分量信息通常對(duì)于表達(dá)和描繪圖像的形狀具有 重要意義,通常是圖像理解時(shí)所使用的最本質(zhì)的形狀特征。例如,在識(shí)別手寫數(shù)字時(shí),能夠通
過形態(tài)學(xué)運(yùn)算得到其骨架信息,在具體識(shí)別時(shí),僅針對(duì)其骨架進(jìn)行運(yùn)算即可。形態(tài)學(xué)處理在視覺檢測(cè)、文字識(shí)別、醫(yī)學(xué)圖像處理、圖像壓縮編碼等領(lǐng)域都有非常重要的應(yīng)用。
形態(tài)學(xué)操作主要包含:腐蝕、膨脹、開運(yùn)算、閉運(yùn)算、形態(tài)學(xué)梯度(Morphological Gradient)運(yùn)算、頂帽運(yùn)算(禮帽運(yùn)算)、黑帽運(yùn)算等操作。腐蝕操作和膨脹操作是形態(tài)學(xué)運(yùn)算的基礎(chǔ),
將腐蝕和膨脹操作進(jìn)行結(jié)合,就可以實(shí)現(xiàn)開運(yùn)算、閉運(yùn)算、形態(tài)學(xué)梯度運(yùn)算、頂帽運(yùn)算、黑帽運(yùn)算、擊中擊不中等不同形式的運(yùn)算。
腐蝕原理
腐蝕是最基本的形態(tài)學(xué)操作之一,它能夠?qū)D像的邊界點(diǎn)消除,使圖像沿著邊界向內(nèi)收縮,也可以將小于指定結(jié)構(gòu)體元素的部分去除。
說白了就是讓圖片中的胖子慢慢的變成瘦子
腐蝕用來“收縮”或者“細(xì)化”二值圖像中的前景,借此實(shí)現(xiàn)去除噪聲、元素分割等功能。
例如,在圖 8-1 中,左圖是原始圖像,右圖是對(duì)其腐蝕的處理結(jié)果。
在腐蝕過程中,通常使用一個(gè)結(jié)構(gòu)元來逐個(gè)像素地掃描要被腐蝕的圖像,并根據(jù)結(jié)構(gòu)元和被腐蝕圖像的關(guān)系來確定腐蝕結(jié)果。
例如,在圖 8-2 中,整幅圖像的背景色是黑色的,前景對(duì)象是一個(gè)白色的圓形。圖像左上角的深色小方塊是遍歷圖像所使用的結(jié)構(gòu)元。在腐蝕過程中,要將該結(jié)構(gòu)元逐個(gè)像素地遍歷整幅圖像,并根據(jù)結(jié)構(gòu)元與被腐蝕圖像的關(guān)系,來確定腐蝕結(jié)果圖像中對(duì)應(yīng)結(jié)構(gòu)元中心點(diǎn)位置的像素點(diǎn)的值。
需要注意的是,腐蝕操作等形態(tài)學(xué)操作是逐個(gè)像素地來改變值的,每次判定的點(diǎn)都是與結(jié)構(gòu)元中心點(diǎn)所對(duì)應(yīng)的點(diǎn)。
圖 8-3 中的兩幅圖像表示結(jié)構(gòu)元與前景色的兩種不同關(guān)系。
根據(jù)這兩種不同的關(guān)系來決定,腐蝕結(jié)果圖像中的結(jié)構(gòu)元中心點(diǎn)所對(duì)應(yīng)位置像素點(diǎn)的像素值。
- 如果結(jié)構(gòu)元完全處于前景圖像中(圖 8-3 的左圖),就將結(jié)構(gòu)元中心點(diǎn)所對(duì)應(yīng)的腐蝕結(jié)果圖像中的像素點(diǎn)處理為前景色(白色,像素點(diǎn)的像素值為 1)。
- 如果結(jié)構(gòu)元未完全處于前景圖像中(可能部分在,也可能完全不在,圖 8-3 的右圖),就將結(jié)構(gòu)元中心點(diǎn)對(duì)應(yīng)的腐蝕結(jié)果圖像中的像素點(diǎn)處理為背景色(黑色,像素點(diǎn)的像素值為 0)。
針對(duì)圖 8-3 中的圖像,腐蝕的結(jié)果就是前景色的白色圓直徑變小。上述結(jié)構(gòu)元也被稱為核。
例如,有需要被腐蝕的圖像 img,其值如下,其中 1 表示白色前景,0 表示黑色背景:
[[0 0 0 0 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 0 0 0 0]]
有一個(gè)結(jié)構(gòu)元 kernel,其值為:
[[1]
[1]
[1]]
如果使用結(jié)構(gòu)元 kernel 對(duì)圖像 img 進(jìn)行腐蝕,則可以得到腐蝕結(jié)果圖像 rst:
[[0 0 0 0 0]
[0 0 0 0 0]
[0 1 1 1 0]
[0 0 0 0 0]
[0 0 0 0 0]]
這是因?yàn)?,?dāng)結(jié)構(gòu)元 kernel 在圖像 img 內(nèi)逐個(gè)像素遍歷時(shí),只有當(dāng)核 kernel 的中心點(diǎn) “kernel[1,0]”位于 img 中的 img[2,1]、img[2,2]、img[2,3]時(shí),核才完全處于前景圖像中。
所以在腐蝕結(jié)果圖像 rst 中,只有這三個(gè)點(diǎn)的值被處理為 1,其余像素點(diǎn)的值被處理為 0。
上述示例如圖 8-4 所示,其中:
- 圖(a)表示要被腐蝕的 img。
- 圖(b)是核 kernel。
- 圖?中的陰影部分是 kernel 在遍歷 img 時(shí),kernel 完全位于前景對(duì)象內(nèi)部時(shí)的 3 個(gè)全部
可能位置;此時(shí),核中心分別位于 img[2,1]、img[2,2]和 img[2,3]處。 - 圖(d)是腐蝕結(jié)果 rst,即在 kernel 完全位于前景圖象中時(shí),將其中心點(diǎn)所對(duì)應(yīng)的 rst 中像素點(diǎn)的值置為 1;當(dāng) kernel 不完全位于前景圖像中時(shí),將其中心點(diǎn)對(duì)應(yīng)的 rst 中像素點(diǎn)的值置為 0。
函數(shù) cv2.erode() 說明
在 OpenCV 中,使用函數(shù) cv2.erode()實(shí)現(xiàn)腐蝕操作,其語法格式為:
dst = cv2.erode( src, kernel[, anchor[, iterations[, borderType[,
borderValue]]]] )
式中:
-
dst 是腐蝕后所輸出的目標(biāo)圖像,該圖像和原始圖像具有同樣的類型和大小。
-
src 是需要進(jìn)行腐蝕的原始圖像,圖像的通道數(shù)可以是任意的。但是要求圖像的深度必須是 CV_8U、CV_16U、CV_16S、CV_32F、CV_64F 中的一種。
-
kernel 代表腐蝕操作時(shí)所采用的結(jié)構(gòu)類型。它可以自定義生成,也可以通過函數(shù)cv2.getStructuringElement()生成。
-
anchor 代表 element 結(jié)構(gòu)中錨點(diǎn)的位置。該值默認(rèn)為(-1,-1),在核的中心位置。
-
iterations 是腐蝕操作迭代的次數(shù),該值默認(rèn)為 1,即只進(jìn)行一次腐蝕操作。
-
borderType 代表邊界樣式,一般采用其默認(rèn)值 BORDER_CONSTANT。該項(xiàng)的具體值如表 8-1 所示。
- borderValue 是邊界值,一般采用默認(rèn)值。在 C++中提供了函數(shù) morphologyDefaultBorderValue()來返回腐蝕和膨脹的“魔力(magic)”邊界值,Python 不支持該函數(shù)。
代碼示例 :使用數(shù)組演示腐蝕的基本原理
代碼如下:
import cv2
import numpy as np
img=np.zeros((5,5),np.uint8)
#對(duì)圖像進(jìn)行賦值
img[1:4,1:4]=1
#設(shè)置卷積核
kernel = np.ones((3,1),np.uint8)
#對(duì)圖像進(jìn)行腐蝕操作
erosion = cv2.erode(img,kernel)
print("img=\n",img)
print("kernel=\n",kernel)
print("erosion=\n",erosion)
運(yùn)行結(jié)果:
img=
[[0 0 0 0 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 0 0 0 0]]
kernel=
[[1]
[1]
[1]]
erosion=
[[0 0 0 0 0]
[0 0 0 0 0]
[0 1 1 1 0]
[0 0 0 0 0]
[0 0 0 0 0]]
從本例中可以看到,只有當(dāng)核 kernel 的中心點(diǎn)位于 img 中的 img[2,1]、img[2,2]、img[2,3]處時(shí),核才完全處于前景圖像中。
所以,在腐蝕結(jié)果圖像中,只有這三個(gè)點(diǎn)的值為 1,其余點(diǎn)的值皆為 0。
示例2:使用函數(shù) cv2.erode()完成圖像腐蝕
代碼如下:
import cv2
import numpy as np
o=cv2.imread("fushi.bmp",cv2.IMREAD_UNCHANGED)
#創(chuàng)建結(jié)構(gòu)元素
kernel = np.ones((7,7),np.uint8)
#腐蝕
erosion = cv2.erode(o,kernel)
cv2.imshow("orriginal",o)
cv2.imshow("erosion",erosion)
cv2.waitKey()
cv2.destroyAllWindows()
運(yùn)行效果:
左圖是原始圖像,右圖是腐蝕處理結(jié)果。從圖中可
以看到,腐蝕操作將原始圖像內(nèi)的毛刺腐蝕掉了。
調(diào)節(jié)函數(shù) cv2.erode()的參數(shù),觀察不同參數(shù)控制下的圖像腐蝕效果
使用參數(shù) iterations = 5 對(duì)函數(shù) cv2.erode()的迭代次數(shù)進(jìn)行控制,讓其迭代 5 次。
代碼如下:
import cv2
import numpy as np
o=cv2.imread("fushi.bmp",cv2.IMREAD_UNCHANGED)
#創(chuàng)建結(jié)構(gòu)元素
kernel = np.ones((7,7),np.uint8)
#腐蝕
erosion = cv2.erode(o,kernel,iterations = 5)
cv2.imshow("orriginal",o)
cv2.imshow("erosion",erosion)
cv2.waitKey()
cv2.destroyAllWindows()
從結(jié)果中可以看出迭代的次數(shù)越多,腐蝕的越明顯文章來源:http://www.zghlxwxcb.cn/news/detail-626300.html
更多參數(shù)調(diào)整測(cè)試可以自己多動(dòng)手試試文章來源地址http://www.zghlxwxcb.cn/news/detail-626300.html
到了這里,關(guān)于opencv35-形態(tài)學(xué)操作-腐蝕cv2.erode()的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!