前言
有些時候圖片上會有一些劃痕或者污漬,會影響圖片的質(zhì)量,假設(shè)我有一張寫有“艾醒”的圖片,但是有花花綠綠的劃痕和污漬,這時我們就可以運(yùn)用腐蝕與膨脹消除這些劃痕和污漬
膨脹
腐蝕的本質(zhì)就是白吃黑,即數(shù)值較大的(較白的)吃掉數(shù)值較小的(較黑的)
我們可以用cv2.dilate進(jìn)行膨脹,參數(shù)為圖片,卷積核,膨脹次數(shù)
其原理就是在卷積核范圍內(nèi),如果周圍顏色淺的(數(shù)值較大的)多,那么當(dāng)前點(diǎn)就應(yīng)該是顏色淺的,否則應(yīng)該是顏色深的
假設(shè)我們有一張圖片名稱為aixing.png
img = cv2.imread('aixing.png')
kernel = np.ones((5,5),np.uint8)
dilate = cv2.dilate(dige_erosion,kernel,iterations = 3)
cv2.imshow('dilate', dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
我們用5x5的卷積核來進(jìn)行3次膨脹
可以看到雖然劃痕和污漬幾乎沒有了,但是這個圖片上的字比之前小不少,為了還原字的大小我們還需要進(jìn)行腐蝕操作,注意腐蝕操作需要跟膨脹操作卷積核和執(zhí)行次數(shù)相同才能還原之前的大小
腐蝕
腐蝕的本質(zhì)就是黑吃白,即數(shù)值較小的(較黑的)吃掉數(shù)值較大的(較白的)
我們可以用cv2.erode進(jìn)行腐蝕,參數(shù)為圖片,卷積核,腐蝕次數(shù)
其原理就是在卷積核中,如果周圍顏色深的(數(shù)值較小的)多,那么當(dāng)前點(diǎn)就應(yīng)該是顏色深的,否則應(yīng)該是顏色淺的
我們進(jìn)行腐蝕
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(dilate,kernel,iterations = 3)
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
現(xiàn)在我們可以看到劃痕和污漬已經(jīng)去掉了
開運(yùn)算與閉運(yùn)算
實(shí)際上這兩個功能很雞肋,開運(yùn)算就是先腐蝕,再膨脹;閉運(yùn)算就是先膨脹,再腐蝕
opencv中cv2.morphologyEx函數(shù)可以實(shí)現(xiàn)開閉運(yùn)算,參數(shù)為圖片,操作類型,卷積核
操作類型參數(shù)
cv2.MORPH_OPEN | cv2.MORPH_CLOSE |
---|---|
開運(yùn)算 | 閉運(yùn)算 |
很明顯,我們剛剛的問題需要進(jìn)行閉運(yùn)算
img = cv2.imread('aixing.png')
kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
可以看到效果并不好,這是為什么呢,因?yàn)殚]運(yùn)算只進(jìn)行了一次膨脹一次腐蝕,而我們得到的較好的結(jié)果是進(jìn)行了3次膨脹和3次腐蝕
開運(yùn)算的代碼也放在這里,但要說明當(dāng)前問題并不適合開運(yùn)算,如果畫面背景是偏深色的,我們需要側(cè)重的部分或者文字是偏淺色的較為適合開運(yùn)算,如果要嘗試我們可以將圖片反色,如何反色呢?令255減去圖片就好了
img = cv2.imread('aixing.png')
kernel = np.ones((5,5),np.uint8)
reverse = 255 - img # 反色
cv2.imshow('opening', reverse)
cv2.waitKey(0)
cv2.destroyAllWindows()
opening = cv2.morphologyEx(reverse, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
可以看到效果也不好,所以這個函數(shù)了解即可。
禮帽與黑帽
沒有什么需要解釋的,了解下面的操作就可以了
禮帽 = 原始輸入-開運(yùn)算結(jié)果
黑帽 = 閉運(yùn)算-原始輸入
#禮帽
img = cv2.imread('aixing.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
#黑帽
img = cv2.imread('aixing.png')
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()
運(yùn)用膨脹和腐蝕獲得圖像輪廓
假設(shè)我們有這樣一個名為yan.jpg的巖元素圖標(biāo)
為了獲取它的輪廓,我們先要將他二值化,即進(jìn)行前幾篇文章提到過的閾值操作,很顯然我們應(yīng)該選用cv2.THRESH_BINARY參數(shù)
yan = cv2.imread('yan.jpg', cv2.IMREAD_GRAYSCALE)
ret, img = cv2.threshold(yan, 220, 255, cv2.THRESH_BINARY)
cv_show(img, 'threshold')
然后分別進(jìn)行一次膨脹和一次腐蝕
kernel = np.ones((5,5),np.uint8)
dilate = cv2.dilate(img,kernel,iterations = 1)
erosion = cv2.erode(img,kernel,iterations = 1)
res = np.hstack((dilate,erosion))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
左側(cè)是膨脹,右側(cè)是腐蝕的結(jié)果
然后膨脹減去腐蝕
cv2.imshow('res', cv2.convertScaleAbs(dilate-erosion))
cv2.waitKey(0)
cv2.destroyAllWindows()
那么為什么是膨脹減腐蝕呢,因?yàn)榕蛎浀陌咨膮^(qū)域多,白色的是非0值,所以實(shí)際上白色輪廓曾是膨脹后的一部分,但是這樣得到的輪廓實(shí)際上比真實(shí)的輪廓要寬,因?yàn)榕蛎洉屳喞蚶飻U(kuò)展,腐蝕會讓輪廓向外擴(kuò)展
那么如何得到恰好的輪廓呢
真實(shí)的輪廓我們可以分為內(nèi)輪廓和外輪廓
要得到內(nèi)輪廓,我們只需膨脹減去膨脹前的圖就好了
cv2.imshow('res', cv2.convertScaleAbs(dilate-img))
cv2.waitKey(0)
cv2.destroyAllWindows()
同樣的,外輪廓可以通過腐蝕前的圖像減去腐蝕后的圖像得到
cv2.imshow('res', cv2.convertScaleAbs(img-erosion))
cv2.waitKey(0)
cv2.destroyAllWindows()
單獨(dú)這樣看也許并不明顯,那么我們將他們畫在一起來看對比
首先我們打開原圖,我們將在原圖上畫輪廓
color_yan = cv2.imread('yan.jpg')
我們要先獲取索引來找到哪些點(diǎn)位需要輪廓
idx1, idx2 = np.where((dilate-erosion)!=0)
idx3, idx4 = np.where((img-erosion)!=0)
idx5, idx6 = np.where((dilate-img)!=0)
由于膨脹減去腐蝕的寬度正好可以被原圖減腐蝕和膨脹減原圖覆蓋,即被外輪廓和內(nèi)輪廓的和覆蓋,所以我們分別展示膨脹減腐蝕與內(nèi)輪廓和外輪廓的對比
與外輪廓的對比
color_yan[idx1, idx2,:] = (255, 0, 0)
color_yan[idx3, idx4,:] = (0, 255, 0)
藍(lán)的是膨脹減去腐蝕的輪廓(下同),綠色的是外輪廓的效果
與內(nèi)輪廓對比
紅色的內(nèi)輪廓的效果文章來源:http://www.zghlxwxcb.cn/news/detail-620660.html
color_yan = cv2.imread('yan.jpg')
color_yan[idx1, idx2,:] = (255, 0, 0)
color_yan[idx5, idx6,:] = (0, 0, 255)
文章來源地址http://www.zghlxwxcb.cn/news/detail-620660.html
到了這里,關(guān)于opencv-python常用函數(shù)解析及參數(shù)介紹(五)——腐蝕與膨脹的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!