淺析bilateral filter雙邊濾波器的理解
圖像去噪的方法很多,如中值濾波,高斯濾波,維納濾波等等。但這些降噪方法容易模糊圖片的邊緣細(xì)節(jié),對(duì)于高頻細(xì)節(jié)的保護(hù)效果并不明顯。相比較而言,bilateral filter雙邊濾波器可以很好的邊緣保護(hù),即可以在去噪的同時(shí),保護(hù)圖像的邊緣特性。雙邊濾波(Bilateral filter)是一種非線性的濾波方法,是結(jié)合圖像的空間鄰近度和像素值相似度的一種折衷處理,同時(shí)考慮空域信息和灰度相似性,達(dá)到保邊去噪的目的(不理解這幾個(gè)概念沒關(guān)系,后面會(huì)慢慢解釋)。
1. 雙邊濾波(Bilateral filter)的原理
雙邊濾波器之所以能夠做到在平滑去噪的同時(shí)還能夠很好的保存邊緣(Edge Preserve),是由于其濾波器的核由兩個(gè)函數(shù)生成:空間域核和值域核
(1)空間域核:由像素位置歐式距離決定的模板權(quán)值
為模板窗口的其他系數(shù)的坐標(biāo);其中
為模板窗口的中心坐標(biāo)點(diǎn);
為高斯函數(shù)的標(biāo)準(zhǔn)差。 使用該公式生成的濾波器模板和高斯濾波器使用的模板是沒有區(qū)別的。
在一些博客和教程里,這個(gè)權(quán)值稱為定義域核,也稱為空間系數(shù),或
空間域(spatial domain S)
。顯示由的計(jì)算公式可知,它是計(jì)算臨近點(diǎn)
到中心點(diǎn)
臨近程度,因此定義域核
是用于衡量空間臨近的程度。
(2)值域核:由像素值的差值決定的模板權(quán)值
其中,為模板窗口的其他系數(shù)的坐標(biāo),
表示圖像在點(diǎn)
處的像素值;
為模板窗口的中心坐標(biāo)點(diǎn),對(duì)應(yīng)的像素值為
;
為高斯函數(shù)的標(biāo)準(zhǔn)差。
一般將權(quán)值稱為值域核,或
像素值域(range domain R)
,不管是值域核還是空間域核
,其大小都在[0 1]之間
(3)將上述兩個(gè)模板相乘就得到了雙邊濾波器的模板權(quán)值:
因此,雙邊濾波器的數(shù)據(jù)公式可以表示如下:
2. 雙邊濾波(Bilateral filter)理解
雙邊濾波(Bilateral filter)其綜合了高斯濾波器(Gaussian Filter)和α-截尾均值濾波器(Alpha-Trimmed mean Filter)的特點(diǎn),同時(shí)考慮了空間域與值域的差別,而Gaussian Filter和α均值濾波分別只考慮了空間域和值域差別。高斯濾波器只考慮像素間的歐式距離,其使用的模板系數(shù)隨著和窗口中心的距離增大而減?。沪?截尾均值濾波器則只考慮了像素灰度值之間的差值,去掉α%的最小值和最大值后再計(jì)算均值。
2.1 空域權(quán)重和值域權(quán)重
的意義:
空域權(quán)重衡量的是
兩點(diǎn)之間的距離,距離越遠(yuǎn)權(quán)重越低;
值域權(quán)重衡量的是
兩點(diǎn)之間的像素值相似程度,越相似權(quán)重越大
這里從圖像的平坦區(qū)域和邊緣區(qū)域定性分析雙邊濾波的降噪效果
- 在平坦區(qū)域,臨近像素的像素值的差值較小,對(duì)應(yīng)值域權(quán)重
接近于1,此時(shí)空域權(quán)重
起主要作用,相當(dāng)于直接對(duì)此區(qū)域進(jìn)行高斯模糊。因此,平坦區(qū)域相當(dāng)于進(jìn)行高斯模糊。
- 在邊緣區(qū)域,臨近像素的像素值的差值較大,對(duì)應(yīng)值域權(quán)重
接近于0,導(dǎo)致此處核函數(shù)下降(因
),當(dāng)前像素受到的影響就越小,從而保持了原始圖像的邊緣的細(xì)節(jié)信息。
3. Opencv雙邊濾波函數(shù):
opencv中提供了bilateralFilter()函數(shù)來實(shí)現(xiàn)雙邊濾波操作,其原型如下:
void cv::bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType = BORDER_DEFAULT )
InputArray src: 輸入圖像,可以是Mat類型,圖像必須是8位或浮點(diǎn)型單通道、三通道的圖像。
- OutputArray dst: 輸出圖像,和原圖像有相同的尺寸和類型。
- int d: 表示在過濾過程中每個(gè)像素鄰域的直徑范圍。如果這個(gè)值是非正數(shù),則函數(shù)會(huì)從第五個(gè)參數(shù)sigmaSpace計(jì)算該值。
- double sigmaColor: 顏色空間過濾器的sigma值,這個(gè)參數(shù)的值月大,表明該像素鄰域內(nèi)有越寬廣的顏色會(huì)被混合到一起,產(chǎn)生較大的半相等顏色區(qū)域。 (這個(gè)參數(shù)可以理解為值域核
的
)
- double sigmaSpace: 坐標(biāo)空間中濾波器的sigma值,如果該值較大,則意味著越遠(yuǎn)的像素將相互影響,從而使更大的區(qū)域中足夠相似的顏色獲取相同的顏色。當(dāng)d>0時(shí),d指定了鄰域大小且與sigmaSpace無關(guān),否則d正比于sigmaSpace. (這個(gè)參數(shù)可以理解為空間域核
的
)
- int borderType=BORDER_DEFAULT: 用于推斷圖像外部像素的某種邊界模式,有默認(rèn)值BORDER_DEFAULT.
雙邊濾波器可以很好的保存圖像邊緣細(xì)節(jié)而濾除掉低頻分量的噪音,但是雙邊濾波器的效率不是太高,花費(fèi)的時(shí)間相較于其他濾波器而言也比較長(zhǎng)。
對(duì)于簡(jiǎn)單的濾波而言,可以將兩個(gè)sigma值設(shè)置成相同的值,如果值<10,則對(duì)濾波器影響很小,如果值>150則會(huì)對(duì)濾波器產(chǎn)生較大的影響,會(huì)使圖片看起來像卡通。
示例代碼:
#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; //定義回調(diào)函數(shù) 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); //創(chuàng)建軌跡條 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); }
【尊重原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處】: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
到此這篇關(guān)于bilateral filter雙邊濾波器的通俗理解的文章就介紹到這了,更多相關(guān)bilateral filter雙邊濾波器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于atoi()與itoa()函數(shù)的內(nèi)部實(shí)現(xiàn)方法詳解
本篇文章是對(duì)atoi()與itoa()函數(shù)的內(nèi)部實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語言實(shí)現(xiàn)考試報(bào)名管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)考試報(bào)名管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06C++類中三大函數(shù)詳解(構(gòu)造、析構(gòu)和拷貝)
c++三大函數(shù)指的是拷貝構(gòu)造、拷貝賦值、析構(gòu)函數(shù),下面這篇文章主要給大家介紹了關(guān)于C++類中三大函數(shù)(構(gòu)造、析構(gòu)和拷貝)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03C語言實(shí)現(xiàn)常用字符串庫函數(shù)(推薦)
這篇文章主要介紹了C語言實(shí)現(xiàn)常用字符串庫函數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11