原理
形態(tài)學(xué)操作是根據(jù)圖像形狀進(jìn)行的簡(jiǎn)單操作亿柑。一般情況下對(duì)二值化圖像進(jìn)行的操作。需要輸入兩個(gè)參數(shù)婆硬,一個(gè)是原始圖像,第二個(gè)被稱為結(jié)構(gòu)化元素或核创淡,它是用來(lái)決定操作的性質(zhì)的。兩個(gè)基本的形態(tài)學(xué)操作是腐蝕和膨脹畦浓。他們的變體構(gòu)成了開(kāi)運(yùn)算送漠,閉運(yùn)算搂蜓,梯度等狼荞。
1. 腐蝕??cv2.erode()
把前景物體的邊界腐蝕掉,但是前景仍然是白色的帮碰。卷積核沿著圖像滑動(dòng),如果與卷積核對(duì)應(yīng)的原圖像的所有像素值都是1拾积,那么中心元素就保持原來(lái)的像素值殉挽,否則就變?yōu)榱恪8鶕?jù)卷積核的大小靠近前景的所有像素都會(huì)被腐蝕掉(變?yōu)?)拓巧,所以前景物體會(huì)變小斯碌,整幅圖像的白色區(qū)域會(huì)減少。這對(duì)于去除白噪音很有用肛度,也可以用來(lái)斷開(kāi)兩個(gè)連在一塊的物體傻唾。
img = cv2.imread('opencv_logo.jpg')
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations=1)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(erosion),plt.title(' Erosion ')
plt.xticks([]), plt.yticks([])
plt.show()
2.膨脹?cv2.dilate()
與腐蝕相反,與卷積核對(duì)應(yīng)的原圖像的像素值中只要有一個(gè)是1承耿,中心元素的像素值就是1冠骄。所以這個(gè)操作會(huì)增加圖像中白色區(qū)域(前景)。一般在去噪音時(shí)先腐蝕再膨脹加袋,因?yàn)楦g再去掉白噪音的同時(shí)凛辣,也會(huì)使前景對(duì)象變小,所以我們?cè)倥蛎浿吧铡_@時(shí)噪音已經(jīng)被去除扁誓,不會(huì)再回來(lái)了,但是前景還在并會(huì)增加蚀之,膨脹也可以用來(lái)連接兩個(gè)分開(kāi)的物體蝗敢。
dilation = cv2.dilate(img,kernel,iterations=1)
3.開(kāi)運(yùn)算??cv2.morphologyEx()
先進(jìn)行腐蝕再進(jìn)行膨脹就叫做開(kāi)運(yùn)算。被用來(lái)去除噪音足删,函數(shù)可以使用cv2.morphologyEx()
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
4.閉運(yùn)算??cv2.morphologyEx()
先膨脹再腐蝕寿谴。被用來(lái)填充前景物體中的小洞,或者前景上的小黑點(diǎn)壹堰。
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
5.形態(tài)學(xué)梯度??cv2.morphologyEx()
其實(shí)就是一幅圖像膨脹與腐蝕的差別拭卿。結(jié)果看上去就像前景物體的輪廓
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
6.禮帽??cv2.morphologyEx()
原始圖像與進(jìn)行開(kāi)運(yùn)算之后得到的圖像的差。
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
7.黑帽??cv2.morphologyEx()
進(jìn)行閉運(yùn)算之后得到的圖像與原始圖像的差贱纠。
blackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
8.形態(tài)學(xué)操作之間的關(guān)系及結(jié)構(gòu)化元素? ?cv2.getStructuringElement()
形態(tài)學(xué)操作之間的關(guān)系?
結(jié)構(gòu)化元素
之前的例子都是使用numpy構(gòu)建了結(jié)構(gòu)化元素峻厚,但是是正方形的,若需要構(gòu)建橢圓或者圓形的核谆焊,可以使用OpenCV提供的函數(shù)cv2.getStructuringElement()惠桃,只需要告訴它你需要的核的形狀和大小。
cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))? ?#矩形核
cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))? #圓/橢圓核
? cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5)) #十字形核