語(yǔ)義分割任務(wù)中,如果預(yù)測(cè)結(jié)果中包含有孤立的噪點(diǎn)、孔洞,則可以使用腐蝕膨脹進(jìn)行處理,提高分割效果。
#定義輸入矩陣,結(jié)構(gòu)核
import cv2 as cv
import numpy as np
input_data = np.array([[1,0,0,0,1],[0,1,1,1,0],[0,1,1,1,0],[0,1,1,1,0],[1,0,1,0,1]],dtype=np.uint8)
kernel = np.uint8(np.zeros((3,3)))
for i in range(3):
kernel[1,i] = 1
kernel[i,1] = 1
print('input data:')
print(input_data)
print('kernel:')
print(kernel)
首先看看輸入矩陣和結(jié)構(gòu)核的結(jié)果,(1表示前景,0表示背景)
input data:
[[1 0 0 0 1]
[0 1 1 1 0]
[0 1 1 1 0]
[0 1 1 1 0]
[1 0 1 0 1]]
kernel:
[[0 1 0]
[1 1 1]
[0 1 0]]
接下里進(jìn)行腐蝕計(jì)算:接著上面的代碼
erode = cv.erode(input_data, kernel)
print('erode result:')
print(erode)
結(jié)果如下:
erode result:
[[0 0 0 0 0]
[0 0 0 0 0]
[0 0 1 0 0]
[0 0 1 0 0]
[0 0 0 0 0]]
從結(jié)果中,可以推斷出,kernel類(lèi)似于卷積一樣在輸入圖像上移動(dòng),從輸入數(shù)據(jù)的坐標(biāo)(0,0)開(kāi)始,kernel的中心與(0,0)重合,如果kernel中的1與它所覆蓋的區(qū)域的1完全重合時(shí),才能把kernel中心與輸入相對(duì)應(yīng)的坐標(biāo)值賦值為1,否則為0。注意在計(jì)算過(guò)程中不改變?cè)紨?shù)據(jù),輸出矩陣為單獨(dú)的矩陣。下圖為計(jì)算過(guò)程的分析:
很明顯當(dāng)結(jié)構(gòu)核位于輸入數(shù)據(jù)邊緣時(shí),只需考慮輸入數(shù)據(jù)內(nèi),結(jié)構(gòu)核與輸入數(shù)據(jù)對(duì)應(yīng)的部分的1是否重合,比如第一個(gè)數(shù)據(jù),由于結(jié)構(gòu)核的中心與輸入數(shù)據(jù)左上角重合,所以結(jié)構(gòu)核只有4個(gè)值在輸入數(shù)據(jù)內(nèi),只考慮這4個(gè)值所對(duì)應(yīng)的2x2的小矩陣即可,對(duì)比發(fā)現(xiàn)結(jié)構(gòu)核是1 1 1 0,而輸入數(shù)據(jù)對(duì)應(yīng)部分是1 0 0 1,結(jié)構(gòu)核中的3個(gè)1并沒(méi)有和輸入數(shù)據(jù)對(duì)應(yīng)部分的1完全重合,因此輸出矩陣的左上角輸出為0。整個(gè)輸入數(shù)據(jù)中只有兩處 ,使得結(jié)構(gòu)核中的1與 輸入數(shù)據(jù)的1完全重合時(shí)才輸出為1,其余都輸出為0。
接下里計(jì)算膨脹計(jì)算:接著上面的代碼
dilate = cv.dilate(input_data, kernel)
print('dilate result:')
print(dilate)
結(jié)果如下:
dilate result:
[[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]]
膨脹與腐蝕相反,只要kernel中的1有一個(gè)與輸入數(shù)據(jù)的1重合,則會(huì)把kernel中心與輸入對(duì)應(yīng)的坐標(biāo)處的值賦為1,否則為0。
接下來(lái)是閉操作:即先膨脹,然后對(duì)膨脹后的結(jié)果進(jìn)行腐蝕
closed = cv.morphologyEx(input_data,cv.MORPH_CLOSE, kernel)
print('closed result:')
print(closed)
結(jié)果如下:
closed result:
[[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]]
由于膨脹之后的結(jié)果全是1,再進(jìn)行腐蝕時(shí),結(jié)果仍然全是1,對(duì)全為0的輸入數(shù)據(jù)做腐蝕時(shí),輸出也全是0。
接下來(lái)是開(kāi)操作:即先腐蝕 然后對(duì)腐蝕后的結(jié)果進(jìn)行膨脹
opened = cv.morphologyEx(input_data,cv.MORPH_OPEN, kernel)
print('opened result:')
print(opened)
結(jié)果如下:
opened result:
[[0 0 0 0 0]
[0 0 1 0 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 0 1 0 0]]
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
