能夠保留邊緣信息的算法——雙邊濾波算法


雙邊濾波算法

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

https://docs.opencv.org/2.4/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html

Bilateral Filters(雙邊濾波算法)原理及實現(一)

https://blog.csdn.net/u013066730/article/details/87859184


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM