【OpenCV-Python】-图像形态学转化
原文為段立輝翻譯,感謝Linux公社
此文檔為自學(xué)轉(zhuǎn)述,如有侵權(quán)請(qǐng)聯(lián)系本人。
目標(biāo):
• 學(xué)習(xí)不同的形態(tài)學(xué)操作,例如腐蝕,膨脹,開運(yùn)算,閉運(yùn)算等
• 學(xué)習(xí)的函數(shù)有:cv2.erode(),cv2.dilate(),cv2.morphologyEx() 等
形態(tài)學(xué)轉(zhuǎn)換原理:一般情況下對(duì)二值化圖像進(jìn)行操作。需要兩個(gè)參數(shù),一個(gè)是原始圖像,第二個(gè)被稱為結(jié)構(gòu)化元素或者核,它是用來(lái)決定操作的性質(zhì)的。基本操作為腐蝕和膨脹,他們的變體構(gòu)成了開運(yùn)算,閉運(yùn)算,梯度等。
1、腐蝕
把前景物體的邊界腐蝕掉,但是前景仍然是白色的。卷積核沿著圖像滑動(dòng),如果與卷積核對(duì)應(yīng)的原圖像的所有像素值都是1,那么中心元素就保持原來(lái)的像素值,否則就變?yōu)榱恪8鶕?jù)卷積核的大小靠近前景的所有像素都會(huì)被腐蝕掉(變?yōu)?),所以前景物體會(huì)變小,整幅圖像的白色區(qū)域會(huì)減少。這對(duì)于去除白噪音很有用,也可以用來(lái)斷開兩個(gè)連在一塊的物體。
erosion = cv2.erode(img, kernel, iterations=1)
2、膨脹
與腐蝕相反,與卷積核對(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è)分開的物體。
dilation = cv2.dilate(img, kernel, iterations=1)
3、開運(yùn)算
先進(jìn)行腐蝕再進(jìn)行膨脹就叫做開運(yùn)算。被用來(lái)去除噪音,函數(shù)可以使用cv2.morphotogyEx()
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
4、閉運(yùn)算
先膨脹再腐蝕。被用來(lái)填充前景物體中的小洞,或者前景上的小黑點(diǎn)。
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
5、形態(tài)學(xué)梯度
其實(shí)就是一幅圖像膨脹與腐蝕的差別。結(jié)果看上去就像前景物體的輪廓。
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
6、禮帽
原始圖像與進(jìn)行開運(yùn)算之后得到的圖像的差。
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
7、黑帽
進(jìn)行閉運(yùn)算之后得到的圖像與原始圖像的差。
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
import cv2
import numpy as np img = cv2.imread('./opencv_learn/image3.png',0) kernel = np.ones((5,5),np.uint8)
# 腐蝕
erosion = cv2.erode(img, kernel, iterations=1)
# 膨脹
dilation = cv2.dilate(img, kernel, iterations=1)
# 開運(yùn)算,先腐蝕在膨脹
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# 閉運(yùn)算,先膨脹在腐蝕
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
# 形態(tài)學(xué)梯度,腐蝕和膨脹的差別
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
# 禮貌,開運(yùn)算后與原圖的差
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
# 黑帽, 閉運(yùn)算后與原圖的差
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) while(1):
cv2.imshow('img',img)
cv2.imshow('erosion',erosion)
cv2.imshow('dilation', dilation)
cv2.imshow('opening', opening)
cv2.imshow('closing',closing)
cv2.imshow('gradient',gradient)
cv2.imshow('tophat', tophat)
cv2.imshow('blackhat', blackhat)
k = cv2.waitKey(1)
if k == ord('q'):
break cv2.destroyAllWindows()
結(jié)構(gòu)化元素
之前的例子都是使用numpy構(gòu)建了結(jié)構(gòu)化元素,但是是正方形的,若需要構(gòu)建橢圓或者圓形的核,可以使用OpenCV提供的函數(shù)cv2.getStructuringElemenet(),只需要告訴它你需要的核的形狀和大小。
總結(jié)
以上是生活随笔為你收集整理的【OpenCV-Python】-图像形态学转化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: a = a + b 与 a += b 的
- 下一篇: Eclipse调试:Run on ser