淺析bilateral filter雙邊濾波器的理解

圖像去噪的方法很多,如中值濾波,高斯濾波,維納濾波等等。但這些降噪方法容易模糊圖片的邊緣細節,對於高頻細節的保護效果並不明顯。相比較而言,bilateral filter雙邊濾波器可以很好的邊緣保護,即可以在去噪的同時,保護圖像的邊緣特性。雙邊濾波(Bilateral filter)是一種非線性的濾波方法,是結合圖像的空間鄰近度像素值相似度的一種折衷處理,同時考慮空域信息灰度相似性,達到保邊去噪的目的(不理解這幾個概念沒關系,後面會慢慢解釋)。


1. 雙邊濾波(Bilateral filter)的原理

雙邊濾波器之所以能夠做到在平滑去噪的同時還能夠很好的保存邊緣(Edge Preserve),是由於其濾波器的核由兩個函數生成:空間域核和值域核

(1)空間域核:由像素位置歐式距離決定的模板權值w_d

q(i,j)為模板窗口的其他系數的坐標;其中p(k,l)

為模板窗口的中心坐標點;\sigma_dσ_d

為高斯函數的標準差。 使用該公式生成的濾波器模板和高斯濾波器使用的模板是沒有區別的。

在一些博客和教程裡,這個權值w_d稱為定義域核,也稱為空間系數,或空間域(spatial domain S)。顯示由w_d的計算公式可知,它是計算臨近點q到中心點p臨近程度,因此定義域核w_d是用於衡量空間臨近的程度。

(2)值域核:由像素值的差值決定的模板權值w_r

其中,q(i,j)為模板窗口的其他系數的坐標,f(i,j)表示圖像在點q(i,j)處的像素值;p(k,l)為模板窗口的中心坐標點,對應的像素值為f(k,l)\sigma_rσ_d為高斯函數的標準差。

一般將權值w_r稱為值域核,像素值域(range domain R),不管是值域核w_r還是空間域核w_d,其大小都在[0 1]之間

(3)將上述兩個模板相乘就得到瞭雙邊濾波器的模板權值:

w(i,j,k,l) = w_d(i,j,k,l) * w_r(i,j,k,l) = exp(-\frac{(i-k)^2 + (j -l)^2}{2\sigma_d^2}-\frac{||f(i,j)-f(k,l)||^2}{2\sigma_r^2})

因此,雙邊濾波器的數據公式可以表示如下:

g(i,j)=\frac{\sum_k_l f(k,l)w(i,j,k,l)))}{\sum_k_l w(i,j,k,l)}

2. 雙邊濾波(Bilateral filter)理解

雙邊濾波(Bilateral filter)其綜合瞭高斯濾波器(Gaussian Filter)和α-截尾均值濾波器(Alpha-Trimmed mean Filter)的特點,同時考慮瞭空間域與值域的差別,而Gaussian Filter和α均值濾波分別隻考慮瞭空間域和值域差別。高斯濾波器隻考慮像素間的歐式距離,其使用的模板系數隨著和窗口中心的距離增大而減小;α-截尾均值濾波器則隻考慮瞭像素灰度值之間的差值,去掉α%的最小值和最大值後再計算均值。

2.1 空域權重w_d和值域權重w_r的意義:

空域權重w_d衡量的是 兩點之間的距離,距離越遠權重越低;

值域權重w_r衡量的是兩點之間的像素值相似程度,越相似權重越大

這裡從圖像的平坦區域邊緣區域定性分析雙邊濾波的降噪效果

  • 在平坦區域,臨近像素的像素值的差值較小,對應值域權重w_r接近於1,此時空域權重w_d起主要作用,相當於直接對此區域進行高斯模糊。因此,平坦區域相當於進行高斯模糊。
  • 在邊緣區域,臨近像素的像素值的差值較大,對應值域權重w_r接近於0,導致此處核函數下降(因w=w_r*w_d),當前像素受到的影響就越小,從而保持瞭原始圖像的邊緣的細節信息。

3. Opencv雙邊濾波函數:

opencv中提供瞭bilateralFilter()函數來實現雙邊濾波操作,其原型如下:

void cv::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值,這個參數的值月大,表明該像素鄰域內有越寬廣的顏色會被混合到一起,產生較大的半相等顏色區域。 (這個參數可以理解為值域核w_r\sigma_r
  • double sigmaSpace: 坐標空間中濾波器的sigma值,如果該值較大,則意味著越遠的像素將相互影響,從而使更大的區域中足夠相似的顏色獲取相同的顏色。當d>0時,d指定瞭鄰域大小且與sigmaSpace無關,否則d正比於sigmaSpace. (這個參數可以理解為空間域核w_d\sigma_d
  • int borderType=BORDER_DEFAULT: 用於推斷圖像外部像素的某種邊界模式,有默認值BORDER_DEFAULT.

雙邊濾波器可以很好的保存圖像邊緣細節而濾除掉低頻分量的噪音,但是雙邊濾波器的效率不是太高,花費的時間相較於其他濾波器而言也比較長。
對於簡單的濾波而言,可以將兩個sigma值設置成相同的值,如果值<10,則對濾波器影響很小,如果值>150則會對濾波器產生較大的影響,會使圖片看起來像卡通。

示例代碼:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
 
using namespace std;
using namespace cv;
 
//定義全局變量
const int g_ndMaxValue = 100;
const int g_nsigmaColorMaxValue = 200;
const int g_nsigmaSpaceMaxValue = 200;
int g_ndValue;
int g_nsigmaColorValue;
int g_nsigmaSpaceValue;
 
Mat g_srcImage;
Mat g_dstImage;
 
//定義回調函數
void on_bilateralFilterTrackbar(int, void*);
 
int main()
{
 g_srcImage = imread("lena.jpg");
 
 //判斷圖像是否加載成功
 if(g_srcImage.empty())
 {
 cout << "圖像加載失敗!" << endl;
 return -1;
 }
 else
 cout << "圖像加載成功!" << endl << endl;
 
 namedWindow("原圖像", WINDOW_AUTOSIZE);
 imshow("原圖像", g_srcImage);
 
 //定義輸出圖像窗口屬性和軌跡條屬性
 namedWindow("雙邊濾波圖像", WINDOW_AUTOSIZE);
 g_ndValue = 10;
 g_nsigmaColorValue = 10;
 g_nsigmaSpaceValue = 10;
 
 char dName[20];
 sprintf(dName, "鄰域直徑 %d", g_ndMaxValue);
 
 char sigmaColorName[20];
 sprintf(sigmaColorName, "sigmaColor %d", g_nsigmaColorMaxValue);
 
 char sigmaSpaceName[20];
 sprintf(sigmaSpaceName, "sigmaSpace %d", g_nsigmaSpaceMaxValue);
 
 //創建軌跡條
 createTrackbar(dName, "雙邊濾波圖像", &g_ndValue, g_ndMaxValue, on_bilateralFilterTrackbar);
 on_bilateralFilterTrackbar(g_ndValue, 0);
 
 createTrackbar(sigmaColorName, "雙邊濾波圖像", &g_nsigmaColorValue,
   g_nsigmaColorMaxValue, on_bilateralFilterTrackbar);
 on_bilateralFilterTrackbar(g_nsigmaColorValue, 0);
 
 createTrackbar(sigmaSpaceName, "雙邊濾波圖像", &g_nsigmaSpaceValue,
   g_nsigmaSpaceMaxValue, on_bilateralFilterTrackbar);
 on_bilateralFilterTrackbar(g_nsigmaSpaceValue, 0);
 
 waitKey(0);
 
 return 0;
}
 
void on_bilateralFilterTrackbar(int, void*)
{
 bilateralFilter(g_srcImage, g_dstImage, g_ndValue, g_nsigmaColorValue, g_nsigmaSpaceValue);
 imshow("雙邊濾波圖像", g_dstImage);
}

【尊重原創,轉載請註明出處】:https://blog.csdn.net/guyuealian/article/details/82660826

參考資料:

【1】https://www.cnblogs.com/wangguchangqing/p/6416401.html

【2】https://blog.csdn.net/MoFMan/article/details/77482794

到此這篇關於bilateral filter雙邊濾波器的通俗理解的文章就介紹到這瞭,更多相關bilateral filter雙邊濾波器內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: