目錄
腐蝕
膨脹
開運(yùn)算
閉運(yùn)算
形態(tài)學(xué)梯度
禮帽
黑帽
形態(tài)學(xué)操作的關(guān)系
構(gòu)建橢圓/圓形的核
腐蝕
就像土壤侵蝕一樣,這個操作會把前景物體的邊界腐蝕掉。這是怎么做到的呢?卷積核沿著圖像滑動,如果與卷積核對應(yīng)的圖像的所有像素值都是1,那么該區(qū)域的所有像素值就是1,否則為0。用于去除白噪聲和斷開兩個連在一起的物體等。用到的函數(shù)是cv2.erode()。
第一個參數(shù)表示輸入圖像。
第二個參數(shù)表示定義的卷積核。
第三個參數(shù)表示迭代腐蝕的次數(shù),通俗的說就是腐蝕多少次。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('../data/image/13.png',0)
"""腐蝕"""
#創(chuàng)建一個5*5的值為1的卷積核
kernel = np.ones((5,5),np.uint8)
#腐蝕運(yùn)算,iteration=1,迭代腐蝕1次
erosion = cv2.erode(img,kernel,iterations=1)
#顯示原圖
plt.subplot(1,2,1),plt.imshow(img,cmap = "gray")
plt.title("Original")
#顯示腐蝕后的圖
plt.subplot(1,2,2),plt.imshow(erosion,cmap ="gray")
plt.title("corrosion")
plt.show()
?文章來源地址http://www.zghlxwxcb.cn/news/detail-447904.html
這里注意一個題外話,在使用plt.imshow()函數(shù)顯示二值圖像時,需要設(shè)置cmap = "gary",否則顯示是不正常的彩色圖像,如:
膨脹
膨脹與腐蝕相反,與卷積核對應(yīng)的原圖像的像素值中只要有一個是1,那么該區(qū)域的所有像素點(diǎn)的值都為1。所以膨脹會增加圖像的白色區(qū)域。一般在去噪聲時,先用腐蝕在膨脹,因?yàn)楦g在去掉白噪聲的同時,也會使前景對象變小,所以使用膨脹放大前景。用到的函數(shù)是cv2.dilate()。
第一個參數(shù)表示原圖像。
第二個參數(shù)表示定義的卷積核。
第三個參數(shù)表示迭代膨脹的次數(shù)。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('../data/image/13.png',0)
#創(chuàng)建一個5*5的值為1的卷積核
kernel = np.ones((5,5),np.uint8)
#iteration=1,迭代膨脹1次
dilation = cv2.dilate(img,kernel,iterations = 1)
#顯示原圖
plt.subplot(1,2,1),plt.imshow(img,cmap = "gray")
plt.title("Original")
#顯示處理后的圖
plt.subplot(1,2,2),plt.imshow(dilation,cmap ="gray")
plt.title("dilation")
plt.show()
?
開運(yùn)算
先進(jìn)行腐蝕運(yùn)算再進(jìn)行膨脹運(yùn)算就叫做開運(yùn)算,被用來去除噪聲??梢韵日{(diào)用腐蝕函數(shù),在調(diào)用膨脹函數(shù),也可以直接使用cv2.morphologyEx()函數(shù)實(shí)現(xiàn)。
第一個參數(shù)表示輸入圖像。
第二個參數(shù)表示形態(tài)學(xué)操作的類型。
- cv2.MORPH_OPEN:開運(yùn)算
- cv2.MOPRH_CLOSE:閉運(yùn)算
- cv2.MPRPH_GRADIENT:形態(tài)學(xué)梯度
- cv2.MORPH_TOPHAT:禮帽
- cv2.MORPH_BLACKHAT:黑帽
第三個參數(shù)表示定義的卷積核。
?
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('../data/image/14.png')
img1= cv2.imread('../data/image/15.png')
img2= cv2.imread('../data/image/13.png')
#創(chuàng)建一個7*7的值為1的卷積核
kernel = np.ones((7,7),np.uint8)
"""開運(yùn)算"""
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
"""閉運(yùn)算"""
closing = cv2.morphologyEx(img1, cv2.MORPH_CLOSE, kernel)
"""形態(tài)學(xué)梯度"""
gradient = cv2.morphologyEx(img2, cv2.MORPH_GRADIENT, kernel)
#顯示原圖
plt.subplot(3,2,1),plt.imshow(img,cmap = "gray")
plt.title("Original")
#顯示處理后的圖
plt.subplot(3,2,2),plt.imshow(opening,cmap ="gray")
plt.title("opening")
plt.subplot(3,2,3),plt.imshow(img1,cmap = "gray")
plt.title("Original")
#顯示處理后的圖
plt.subplot(3,2,4),plt.imshow(closing,cmap ="gray")
plt.title("closing")
plt.subplot(3,2,5),plt.imshow(img2,cmap = "gray")
plt.title("Original")
#顯示處理后的圖
plt.subplot(3,2,6),plt.imshow(gradient,cmap ="gray")
plt.title("gradient")
plt.show()
閉運(yùn)算
先進(jìn)行膨脹運(yùn)算再進(jìn)行腐蝕運(yùn)算就叫做閉運(yùn)算,被用來填充前景物體中的小洞,或者前景物體上的小黑點(diǎn)。程序和函數(shù)參數(shù)見開運(yùn)算。
形態(tài)學(xué)梯度
結(jié)果像是前景物體的輪廓,像是膨脹的結(jié)果減去腐蝕的結(jié)果。程序和函數(shù)參數(shù)見開運(yùn)算。
禮帽
原始圖像與進(jìn)行開運(yùn)算之后的圖像的差。函數(shù)參數(shù)見開運(yùn)算。下面的例子對比了使用使用函數(shù)計(jì)算的結(jié)果和不使用函數(shù)計(jì)算的結(jié)果是否相同。
img = cv2.imread('../data/image/13.png')
#創(chuàng)建一個11*11的值為1的卷積核
kernel = np.ones((11,11),np.uint8)
#開運(yùn)算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
#原圖像減去開運(yùn)算后的圖
tophat1 = img - opening
#禮帽
tophat2 = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
plt.subplot(1,4,1),plt.imshow(img,cmap = "gray")
plt.title("Original")
plt.subplot(1,4,2),plt.imshow(opening ,cmap = "gray")
plt.title("Opening")
plt.subplot(1,4,3),plt.imshow(tophat1,cmap = "gray")
plt.title("tophat1")
plt.subplot(1,4,4),plt.imshow(tophat2,cmap = "gray")
plt.title("tophat2")
plt.show()
?
?
黑帽
進(jìn)行閉運(yùn)算之后的圖像與原始圖像的差。
img = cv2.imread('../data/image/13.png')
#創(chuàng)建一個11*11的值為1的卷積核
kernel = np.ones((11,11),np.uint8)
#閉運(yùn)算
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
#閉運(yùn)算減去原圖像
blackhat1 =closing - img
#禮帽
blackhat2 = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
plt.subplot(1,4,1),plt.imshow(img,cmap = "gray")
plt.title("Original")
plt.subplot(1,4,2),plt.imshow(closing,cmap = "gray")
plt.title("closing")
plt.subplot(1,4,3),plt.imshow(blackhat1,cmap = "gray")
plt.title("blackhat1")
plt.subplot(1,4,4),plt.imshow(blackhat2,cmap = "gray")
plt.title("blackhat2")
plt.show()
?
形態(tài)學(xué)操作的關(guān)系
開運(yùn)算 = 先腐蝕,后膨脹
閉運(yùn)算 = 先膨脹,后腐蝕
形態(tài)學(xué)梯度 = 膨脹 - 腐蝕
禮帽 = 原圖 - 開運(yùn)算
黑帽 = 閉運(yùn)算 - 原圖
構(gòu)建橢圓/圓形的核
使用cv2.getStructuringElement()函數(shù)。
第一個參數(shù)表示核的形狀。
- cv2.MOPRH_RECT:矩形核
- cv2.MORPH_ELLIPSE:橢圓核
- cv2.MORPH_CROSS:十字交叉核
第二個參數(shù)表示核的大小
文章來源:http://www.zghlxwxcb.cn/news/detail-447904.html
?
到了這里,關(guān)于OpenCv-Python學(xué)習(xí)筆記(九):形態(tài)學(xué)轉(zhuǎn)換的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!