雙邊濾波算法
1、原理
高斯濾波是以距離為權重,設計濾波模板作為濾波系數,只考慮了像素間的空間位置上的關系,因此濾波的結果會丟失邊緣的信息。
高斯濾波的缺陷如下圖所示:平坦區域正常濾波,圖像細節沒有變化,而在突變的邊緣上,因為只使用了距離來確定濾波權重,導致邊緣被模糊
在高斯基礎上,進一步優化,疊加了像素值的考慮,因此也就引出了雙邊濾波,一種非線性濾波,濾波效果對保留邊緣更有效。
為了理解雙邊濾波的距離和像素差兩個影響因素,先說明下面兩個概念幫助理解。
空間距離:當前點距離濾波模板中心點的歐式距離。
灰度距離:當前點距離濾波模板中心點的灰度的差值的絕對值。
雙邊濾波的核函數是空間域核與像素范圍域核的綜合結果:
1)在圖像的平坦區域,像素值變化很小,那么像素差值接近於0,對應的像素范圍域權重接近於1,此時空間域權重起主要作用,相當於進行高斯模糊;
2)在圖像的邊緣區域,像素值變化很大,那么像素差值大,對應的像素范圍域權重變大,即使距離遠空間域權重小,加上像素域權重總的系數也較大,從而保護了邊緣的信息。
雙邊濾波的效果如下圖,在突變的邊緣上,使用了像素差權重,所以很好的保留了邊緣。
雙邊濾波的原理如下圖所示。
2、測試實驗
OpenCV函數原型:
CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType = BORDER_DEFAULT );
InputArray src: 輸入圖像,可以是Mat類型,圖像必須是8位或浮點型單通道、三通道的圖像。
OutputArray dst: 輸出圖像,和原圖像有相同的尺寸和類型。
int d: 表示在過濾過程中每個像素鄰域的直徑范圍。如果這個值是非正數,則函數會從第五個參數sigmaSpace計算該值。
double sigmaColor: 顏色空間過濾器的sigma值,這個參數的值越大,更大的值域空間影響結果。
double sigmaSpace: 坐標空間中濾波器的sigma值,如果該值較大,更大的定義域空間影響結果。
int borderType=BORDER_DEFAULT:邊界模式,有默認值BORDER_DEFAULT.
測試代碼:
static void OnBilateralFilter(int filterSz, void *) { bilateralFilter(img, img3, filterSz, filterSz * 2, filterSz / 2); imshow("雙邊濾波", img3); } namedWindow("雙邊濾波", 1); createTrackbar("內核值", "雙邊濾波", &gMedianBlurValue, 40, OnBilateralFilter); OnBilateralFilter(gMedianBlurValue, 0);
3、測試結果
4、參考文獻
Bilateral Filtering for Gray and Color Images, C. Tomasi, R. Manduch
http://www.cs.jhu.edu/~misha/ReadingSeminar/Papers/Tomasi98.pdf
Smoothing Images
Bilateral Filters(雙邊濾波算法)原理及實現(一)