雙邊濾波(BilateralFiltering)是一種圖像處理濾波技術,用于平滑圖像并同時保留邊緣信息。與其他傳統(tǒng)的線性濾波方法不同,雙邊濾波在考慮像素之間的空間距離之外,還考慮了像素之間的灰度值相似性。這使得雙邊濾波能夠有效地去除噪聲,同時保持圖像的細節(jié)和邊緣。
雙邊濾波的核心思想是使用一個滑動窗口(卷積核)在圖像上移動,并計算窗口中像素的加權平均值來替代中心像素的值。這里的權重包括兩個部分:一個是空間權重,根據(jù)像素之間的空間距離計算;另一個是灰度值權重,根據(jù)像素之間的灰度值相似性計算。空間權重用于保持邊緣信息,而灰度值權重用于平滑圖像。
在雙邊濾波中,窗口的大小和兩個權重的參數(shù)是需要設置的超參數(shù),它們會影響濾波效果。較大的窗口大小和權重參數(shù)可以保留更多的圖像細節(jié),但也會導致計算復雜度增加。
基本原理
前述濾波方式基本都只考慮了空間的權重信息,這種情況計算起來比較方便,但是在邊緣信息的處理上存在較大的問題。
例如,在圖 7-30 中,圖像左側是黑色,右側是白色,中間是很明顯的邊緣。
在均值濾波、方框濾波、高斯濾波中,都會計算邊緣上各個像素點的加權平均值,從而模糊邊緣信息。
如圖 7-31 所示是高斯濾波處理的結果圖像。
從圖 7-31 可以看到,經(jīng)過高斯濾波處理后,邊緣信息變得很模糊,均值濾波處理也會造成類似的問題。邊界模糊是濾波處理過程中對鄰域像素取均值所造成的結果,上述濾波處理過程單純地考慮空間信息,造成了邊界模糊和部分信息的丟失。
雙邊濾波在計算某一個像素點的新值時,不僅考慮距離信息(距離越遠,權重越?。?,還考慮色彩信息(色彩差別越大,權重越?。kp邊濾波綜合考慮距離和色彩的權重結果,既能夠有效地去除噪聲,又能夠較好地保護邊緣信息。
在雙邊濾波中,當處在邊緣時,與當前點色彩相近的像素點(顏色距離很近)會被給予較大的權重值;而與當前色彩差別較大的像素點(顏色距離很遠)會被給予較小的權重值(極端情況下權重可能為 0,直接忽略該點),這樣就保護了邊緣信息。
例如,在圖 7-32 中:
- 圖(a)是原始圖像,左側區(qū)域是白色(像素值為 255),右側區(qū)域是黑色(像素值為 0)。
- 圖(b)是進行均值濾波的可能結果。在進行均值濾波時,僅僅考慮空間信息,此時左右兩側的像素的處理結果是綜合考慮周邊元素像素值,并對它們取均值得到的。
- 圖?是進行雙邊濾波的可能結果。在進行雙邊濾波時,不僅考慮空間信息,還考慮色彩差別信息
在雙邊濾波中,在計算左側白色區(qū)域邊緣點的濾波結果時:
-
對于白色的點,給予的權重較大。
-
對于黑色的點,由于色彩差異較大,顏色距離很遠(注意,不是像素點之間的物理距離,而是顏色值的距離。像素點的值分別是 0 和 255,差別很大,所以說它們顏色距離很遠),因此可以將它們的權重設置為 0。
這樣,在計算左側白色邊緣濾波結果時,得到的仍然是白色。因此,雙邊濾波后,左側邊緣得到保留。
在計算右側黑色區(qū)域邊緣點的濾波結果時:
-
對于黑色的點,給予的權重較大。
-
對于白色的點,由于色彩差異較大,顏色距離很遠,因此可以將它們的權重設置為 0。
這樣,在計算右側黑色邊緣濾波結果時,得到的仍然是黑色。因此,雙邊濾波后,左側邊緣得到保留。
cv2.bilateralFilter() 函數(shù)說明
在 OpenCV 中,實現(xiàn)雙邊濾波的函數(shù)是 cv2.bilateralFilter()
,該函數(shù)的語法是:
dst = cv2.bilateralFilter( src, d, sigmaColor, sigmaSpace, borderType )
式中:
- dst 是返回值,表示進行雙邊濾波后得到的處理結果。
-
src 是需要處理的圖像,即原始圖像。它能夠有任意數(shù)量的通道,并能對各個通道獨立
處理。圖像深度應該是 CV_8U、CV_16U、CV_16S、CV_32F 或者 CV_64F 中的一種。 - d 是在濾波時選取的空間距離參數(shù),這里表示以當前像素點為中心點的直徑。如果該值為非正數(shù),則會自動從參數(shù) sigmaSpace 計算得到。如果濾波空間較大(d>5),則速度較慢。因此,在實時應用中,推薦 d=5。對于較大噪聲的離線濾波,可以選擇 d=9。
- sigmaColor 是濾波處理時選取的顏色差值范圍,該值決定了周圍哪些像素點能夠參與到濾波中來。與當前像素點的像素值差值小于 sigmaColor 的像素點,能夠參與到當前的濾波中。該值越大,就說明周圍有越多的像素點可以參與到運算中。該值為 0 時,濾波失去意義;該值為 255 時,指定直徑內的所有點都能夠參與運算。
- sigmaSpace 是坐標空間中的 sigma 值。它的值越大,說明有越多的點能夠參與到濾波計算中來。當 d>0 時,無論 sigmaSpace 的值如何,d 都指定鄰域大小;否則,d 與 sigmaSpace的值成比例。
- borderType 是邊界樣式,該值決定了以何種方式處理邊界。一般情況下,不需要考慮該值,直接采用默認值即可。
為了簡單起見,可以將兩個 sigma(sigmaColor 和 sigmaSpace)值設置為相同的。如果它們的值比較?。ɡ缧∮?br> 10),濾波的效果將不太明顯;如果它們的值較大(例如大于 150),則濾波效果會比較明顯,會產(chǎn)生卡通效果。在函數(shù)
cv2.bilateralFilter()中,參數(shù) borderType 是可選參數(shù),其余參數(shù)全部為必選參數(shù)。
實驗:針對噪聲圖像,對其進行雙邊濾波,顯示濾波的結果。
代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-624504.html
import cv2
o=cv2.imread("lenaNoise.png")
r=cv2.bilateralFilter(o,25,100,100)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
其中左圖是原始圖像,右圖是雙邊濾波的結果圖像。從
圖中可以看出,雙邊濾波去除噪聲的效果并不好。文章來源地址http://www.zghlxwxcb.cn/news/detail-624504.html
到了這里,關于opencv-34 圖像平滑處理-雙邊濾波cv2.bilateralFilter()的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!