????????前面我們介紹的濾波方法都會(huì)對(duì)圖像造成模糊,使得邊緣信息變?nèi)趸蛘呦В虼诵枰环N能夠?qū)D像邊緣信息進(jìn)行保留的濾波算法,雙邊濾波是綜合考慮空間信息和色彩信息的濾波方式,在濾波過程中能夠有效地保護(hù) 圖像內(nèi)的邊緣信息。
6.1 原理介紹
????????之前介紹的濾波處理過程單純地考慮空間信息,造成了邊界模糊和部分信息的丟失。 雙邊濾波在計(jì)算某一個(gè)像素點(diǎn)的新值時(shí),不僅考慮距離信息(距離越遠(yuǎn),權(quán)重越?。?,還考慮色彩信息(色彩差別越大,權(quán)重越?。?。
????????雙邊濾波綜合考慮距離和色彩的權(quán)重結(jié)果,既能夠有效地去除噪聲,又能夠較好地保護(hù)邊緣信息。 在雙邊濾波中,當(dāng)處在邊緣時(shí),與當(dāng)前點(diǎn)色彩相近的像素點(diǎn)(顏色距離很近)會(huì)被給予較大的權(quán)重值;而與當(dāng)前色彩差別較大的像素點(diǎn)(顏色距離很遠(yuǎn))會(huì)被給予較小的權(quán)重值(極端情況下權(quán)重可能為0,直接忽略該點(diǎn)),這樣就保護(hù)了邊緣信息。
6.2 函數(shù)語(yǔ)法
????????在OpenCV中,實(shí)現(xiàn)雙邊濾波的函數(shù)是cv2.bilateralFilter(),該函數(shù)的語(yǔ)法是: ????????dst=cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)
????????式中:
????????● dst是返回值,表示進(jìn)行雙邊濾波后得到的處理結(jié)果。
????????● src 是需要處理的圖像,即原始圖像。它能夠有任意數(shù)量的通道,并能對(duì)各通道獨(dú)立處理。圖像深度應(yīng)該是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一 種。????????????????????????
????????● d是在濾波時(shí)選取的空間距離參數(shù),這里表示以當(dāng)前像素點(diǎn)為中心點(diǎn)的直徑。如果該值為非正數(shù),則會(huì)自動(dòng)從參數(shù) sigmaSpace 計(jì)算得到。如果濾波空間較大(d>5),則速度較慢。因此,在實(shí)時(shí)應(yīng)用中,推薦d=5。對(duì)于較大噪聲的離線濾波,可以選擇d=9。
????????● sigmaColor是濾波處理時(shí)選取的顏色差值范圍,該值決定了周圍哪些像素點(diǎn)能夠參與到濾波中來。與當(dāng)前像素點(diǎn)的像素值差值小于 sigmaColor 的像素點(diǎn),能夠參與到當(dāng)前的濾波中。該值越大,就說明周圍有越多的像素點(diǎn)可以參與到運(yùn)算中。該值為0時(shí),濾波失去意義;該值為255時(shí),指定直徑內(nèi)的所有點(diǎn)都能夠參與運(yùn)算。
????????● sigmaSpace是坐標(biāo)空間中的sigma值。它的值越大,說明有越多的點(diǎn)能夠參與到濾波計(jì)算中來。當(dāng)d>0時(shí),無論sigmaSpace的值如何,d都指定鄰域大??;否則,d與 sigmaSpace的值成比例。
????????● borderType是邊界樣式,該值決定了以何種方式處理邊界。一般情況下,不需要考慮該值,直接采用默認(rèn)值即可。
????????為了簡(jiǎn)單起見,可以將兩個(gè)sigma(sigmaColor和sigmaSpace)值設(shè)置為相同的。如果它們的值比較?。ɡ缧∮?0),濾波的效果將不太明顯;如果它們的值較大(例如大于150),則濾波效果會(huì)比較明顯,會(huì)產(chǎn)卡通效果。
????????在函數(shù)cv2.bilateralFilter()中,參數(shù)borderType是可選參數(shù),其余參數(shù)全部為必選參數(shù)。
6.3 程序示例
import cv2 as cv
def cv_show(name, img):
cv.imshow(name, img)
cv.waitKey(0)
cv.destroyAllWindows()
def add_peppersalt_noise(image, n=10000):
result = image.copy()
# 測(cè)量圖片的長(zhǎng)和寬
w, h =image.shape[:2]
# 生成n個(gè)椒鹽噪聲
for i in range(n):
x = np.random.randint(1, w)
y= np.random.randint(1, h)
if np.random.randint(0, 2) == 0 :
result[x, y] = 0
else:
result[x,y] = 255
return result
img = cv.imread('D:\\dlam.jpg')
if img is None:
print('Failed to read the image')
img1 = add_peppersalt_noise(img)
cv_show('img1', img1)
img2 = cv.bilateralFilter(img1, 9, 150, 150)
cv_show('img2', img2)
原圖如下:
?添加椒鹽噪聲后:
?雙邊濾波效果:
文章來源:http://www.zghlxwxcb.cn/news/detail-454088.html
? ? ? ? ?可以看到,雙邊濾波對(duì)邊緣信息有較好的保留,但是不能較好的消除噪聲。(也試過中值濾波與雙邊濾波一起使用,但是邊緣的像素還是會(huì)缺失,濾波效果不是很好)文章來源地址http://www.zghlxwxcb.cn/news/detail-454088.html
到了這里,關(guān)于Opencv之圖像濾波:6.雙邊濾波(cv2.bilateralFilter)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!