雙邊濾波(Bilateral filter)是一種可以保邊去噪的濾波器。之所以可以達(dá)到此去噪效果,是因?yàn)闉V波器是由兩個(gè)函數(shù)構(gòu)成。一個(gè)函數(shù)是由幾何空間距離決定濾波器系數(shù)。另一個(gè)由像素差值決定濾波器系數(shù)。
雙邊濾波器中,輸出像素的值依賴于鄰域像素的值的加權(quán)組合,權(quán)重系數(shù)w(i,j,k,l)取決于定義域核和值域核的乘積,同時(shí)考慮了空間域與值域的差別,而Gaussian Filter和α均值濾波分別只考慮了空間域和值域差別。
雙邊濾波原理(Bilateral Filtering)
基本思路
雙邊濾波(bilateral filtering)的基本思路是同時(shí)考慮將要被濾波的像素點(diǎn)的空域信息(domain)和值域信息(range)。因此是一種 combined 濾波方式,因此叫做 bilateral ,即同時(shí)考慮兩方面的信息。首先,對(duì)于圖像濾波來(lái)說(shuō),一個(gè)通常的intuition是:(自然)圖像在空間中變化緩慢,因此相鄰的像素點(diǎn)會(huì)更相近。但是這個(gè)假設(shè)在圖像的邊緣處變得不成立。如果在邊緣處也用這種思路來(lái)進(jìn)行濾波的話,即認(rèn)為相鄰相近,則得到的結(jié)果必然會(huì)模糊掉邊緣,這是不吼的,因此考慮再利用像素點(diǎn)的值的大小進(jìn)行補(bǔ)充,因?yàn)檫吘墐蓚?cè)的點(diǎn)的像素值差別很大,因此會(huì)使得其加權(quán)的時(shí)候權(quán)重具有很大的差別,從而使得只考慮自己所屬的一邊的鄰域。可以理解成先根據(jù)像素值對(duì)要用來(lái)進(jìn)行濾波的鄰域做一個(gè)分割或分類,再給該點(diǎn)所屬的類別相對(duì)較高的權(quán)重,然后進(jìn)行鄰域加權(quán)求和,得到最終結(jié)果。
實(shí)現(xiàn)原理
在 bilateral filtering 中,兩個(gè)要素即:closeness 和 similarity ,或者說(shuō) domain 和 range ,或者 geometric 和 photometric ,其數(shù)學(xué)表達(dá)方式相近,如下:
其中積分號(hào)前面為歸一化因子,這里考慮對(duì)所有的像素點(diǎn)進(jìn)行加權(quán),c 和 s 是 closeness 和 similarity 函數(shù),x 代表要求的點(diǎn),f (x) 代表該點(diǎn)的像素值。f(x) –》 h(x) 為濾波前后的image。我們最后的濾波函數(shù)為
由于domain component,使得濾波特性較好,由于range component,使得crisp edge 可以保持。
下圖示意了有邊緣的時(shí)候的權(quán)重和最后的濾波結(jié)果,可以看出權(quán)重在邊界有很明顯的分界,從而幾乎只對(duì)自己所屬的邊緣一側(cè)的像素點(diǎn)進(jìn)行加權(quán)。
實(shí)現(xiàn) c 和 s 兩個(gè)函數(shù)的一種方法即 Gaussian 核,決定其性質(zhì)的為各自的sigma參數(shù),即 σdσd 和 σrσr 。
template
unsigned char bilateralProc(
hls::Window &win,
WEIGHT_VALUE weights[WIN_SZ*WIN_SZ][256],
WEIGHT_MAP map[(WIN_SZ》》1)*(WIN_SZ》》1)+1])
{
#pragma HLS INLINE
ap_ufixed《16,1》 color_weights;
ap_ufixed《32,16》 weight_sum=0;
ap_ufixed《32,16》 px_sum=0;
for (int i=0;i》1;
ap_uint《8》 sub_sq = sub*sub;
ap_int《8》 ei = i-sub;
ap_int《8》 ej = j-sub;
ap_uint《8》 comp = ei*ei;
comp += ej*ej;
if(comp》sub_sq)
{
continue;
}
else
{
ap_int《9》 diffpx = win(i, j) - win(WIN_SZ》》1,WIN_SZ》》1);
if(diffpx 《 0)
{
diffpx = -diffpx;
}
if(comp == 0)
color_weights = 1;
else
color_weights = (ap_ufixed《16,1》)weights[map[comp]][diffpx];
px_sum += (color_weights)*(ap_uint《16》)(win(i,j));
weight_sum += color_weights;
}
}
})(px_sum/weight_sum) + (ap_ufixed《32,16》)(0.5);
return value;
}
template
void _filter(
hls::Mat &src,
hls::Mat &dst,
WEIGHT_VALUE weights[WIN_SZ*WIN_SZ][256],
WEIGHT_MAP map[(WIN_SZ》》1)*(WIN_SZ》》1)+1])
{
HLS_SIZE_T IMG_HEIGHT = src.rows;
HLS_SIZE_T IMG_WIDTH = src.cols;
hls::filter2d_kernel fk_opr;
hls::Window src_kernel_win;
hls::LineBuffer main_buf;
hls::LineBuffer col_buf;
HLS_SIZE_T fillvalue=255;
HLS_SIZE_T loophight=IMG_HEIGHT+WIN_SZ-1;
HLS_SIZE_T loopwidth=IMG_WIDTH+WIN_SZ-1;
HLS_SIZE_T buf_row=0;
HLS_SIZE_T buf_rows,buf_cols;
HLS_SIZE_T heightloop= IMG_HEIGHT+WIN_SZ-1;
HLS_SIZE_T widthloop = IMG_WIDTH+WIN_SZ-1;//one pixel overlap, so it should minus one
loop_height: for(HLS_SIZE_T i= 0;i《 heightloop;i++) {
#pragma HLS LOOP_TRIPCOUNT MAX=ROWS
loop_width: for (HLS_SIZE_T j= 0;j《 widthloop;j++) {
#pragma HLS DEPENDENCE array inter false
#pragma HLS LOOP_TRIPCOUNT MAX=COLS
#pragma HLS LOOP_FLATTEN OFF
#pragma HLS PIPELINE II=1
if(j
》 temp;
else
temp=fillvalue;
main_buf(0,j)=(temp&0xFF);
}
for(buf_row=0; buf_row=1; buf_row--){
HLS_TNAME(HLS_8UC1) temp=col_buf(buf_row-1,0);
src_kernel_win(buf_row-1,0)=temp;
main_buf(buf_row,j)=temp;
}
}
else
{
for(HLS_SIZE_T row=0; row=1; col--)
{
src_kernel_win(row,col) = src_kernel_win(row,col-1);
}
}
for(HLS_SIZE_T row=0; row= (WIN_SZ-1) && j》=(WIN_SZ-1))
{
ap_uint《8》 temp_out = bilateralProc(src_kernel_win, weights, map);
dst.data_stream[0] 《《 temp_out;
}
}//w
}//h
}
void hls_BilateralFilter( AXI_STREAM &INPUT_STREAM, AXI_STREAM &OUTPUT_STREAM,int rows, int cols,
WEIGHT_VALUE weights[MAX_WIN_SZ*MAX_WIN_SZ][256],
WEIGHT_MAP map[(MAX_WIN_SZ》》1)*(MAX_WIN_SZ》》1)+1])
{
#pragma HLS INTERFACE axis port=INPUT_STREAM
#pragma HLS INTERFACE axis port=OUTPUT_STREAM
#pragma HLS INTERFACE s_axilite port=rows bundle=BUS_CTRL
#pragma HLS INTERFACE s_axilite port=cols bundle=BUS_CTRL
#pragma HLS INTERFACE s_axilite port=weights bundle=BUS_CTRL
#pragma HLS INTERFACE s_axilite port=map bundle=BUS_CTRL
#pragma HLS INTERFACE s_axilite port=return bundle=BUS_CTRL
hls::Mat src(rows,cols);
hls::Mat dst(rows,cols);
hls::Mat src0(rows,cols);
hls::Mat src1(rows,cols);
hls::Mat gray0(rows,cols);
hls::Mat gray1(rows,cols);
#pragma HLS dataflow
hls::AXIvideo2Mat(INPUT_STREAM, src);
hls::Duplicate(src,src0,src1);
hls::CvtColor(src0,gray0);
_filter(gray0, gray1, weights, map);
hls::CvtColor(gray1,dst);
hls::Mat2AXIvideo(dst, OUTPUT_STREAM);
}
C仿真效果:
原圖
雙邊濾波器
對(duì)比一下高斯模糊濾波器
-
雙邊濾波
+關(guān)注
關(guān)注
0文章
4瀏覽量
2124
發(fā)布評(píng)論請(qǐng)先 登錄
數(shù)字濾波器的設(shè)計(jì)和實(shí)現(xiàn)

基于Matlab與FPGA的雙邊濾波算法實(shí)現(xiàn)

想用FPGA實(shí)現(xiàn)雙邊濾波算法,有懂得能說(shuō)一下具體的實(shí)現(xiàn)步驟嗎
一種快速Bilateral濾波器的設(shè)計(jì)與實(shí)現(xiàn)
采用密度k_means和改進(jìn)雙邊濾波的點(diǎn)云自適應(yīng)去噪算法_郭進(jìn)
詳細(xì)解析濾波器的定義,濾波器的特性,濾波器的工作原理,濾波器的分類,濾波器的典型電路原理圖

雙邊濾波點(diǎn)云去噪算法

圖像處理基礎(chǔ)(5):雙邊濾波器
如何進(jìn)行雙邊濾波的圖像處理算法研究

雙邊帶調(diào)制原理_雙邊帶調(diào)制的優(yōu)缺點(diǎn)

LabVIEW:適合點(diǎn)云平滑的雙邊濾波器

空間濾波器matlab實(shí)現(xiàn)

如何使用HLS加速FPGA上的FIR濾波器

評(píng)論