雙邊濾波算法

1、原理

高斯濾波是以距離為權重,設計濾波模板作為濾波係數,只考慮了像素間的空間位置上的關係,因此濾波的結果會丟失邊緣的信息。

高斯濾波的缺陷如下圖所示:平坦區域正常濾波,圖像細節沒有變化,而在突變的邊緣上,因為只使用了距離來確定濾波權重,導致邊緣被模糊。

雙邊濾波算法

在高斯基礎上,進一步優化,疊加了像素值的考慮,因此也就引出了雙邊濾波,一種非線性濾波,濾波效果對保留邊緣更有效。

雙邊濾波算法

為了理解雙邊濾波的距離和像素差兩個影響因素,先說明下面兩個概念幫助理解。

空間距離:當前點距離濾波模板中心點的歐式距離。

雙邊濾波算法

灰度距離:當前點距離濾波模板中心點的灰度的差值的絕對值。

雙邊濾波算法

雙邊濾波的核函數是空間域核與像素範圍域核的綜合結果:

1)在圖像的平坦區域,像素值變化很小,那麼像素差值接近於0,對應的像素範圍域權重接近於1,此時空間域權重起主要作用,相當於進行高斯模糊;

2)在圖像的邊緣區域,像素值變化很大,那麼像素差值大,對應的像素範圍域權重變大,即使距離遠空間域權重小,加上像素域權重總的係數也較大,從而保護了邊緣的信息。

雙邊濾波的效果如下圖,在突變的邊緣上,使用了像素差權重,所以很好的保留了邊緣。

雙邊濾波算法

雙邊濾波的原理如下圖所示。

雙邊濾波算法

2、測試實驗

OpenCV函數原型:

<code>CV_EXPORTS_W void bilateralFilter( 
InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );
/<code>

InputArray src: 輸入圖像,可以是 Mat 類型,圖像必須是 8 位或浮點型單通道、三通道的圖像。

OutputArray dst: 輸出圖像,和原圖像有相同的尺寸和類型。

int d: 表示在過濾過程中每個像素鄰域的直徑範圍。如果這個值是非正數,則函數會從第五個參數 sigmaSpace 計算該值。

double sigmaColor: 顏色空間過濾器的 sigma 值,這個參數的值越大,更大的值域空間影響結果。

double sigmaSpace: 座標空間中濾波器的 sigma 值,如果該值較大,更大的定義域空間影響結果。

int borderType=BORDER_DEFAULT: 邊界模式,有默認值 BORDER_DEFAULT.

測試代碼:

<code>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);
/<code>

3 、測試結果

雙邊濾波算法


分享到:


相關文章: