0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

雙邊濾波原理_HLS實現(xiàn)Bilateral Filtering雙邊濾波器

Hx ? 作者:工程師陳翠 ? 2018-06-29 08:19 ? 次閱讀

雙邊濾波(Bilateral filter)是一種可以保邊去噪的濾波器。之所以可以達到此去噪效果,是因為濾波器是由兩個函數(shù)構成。一個函數(shù)是由幾何空間距離決定濾波器系數(shù)。另一個由像素差值決定濾波器系數(shù)。

雙邊濾波器中,輸出像素的值依賴于鄰域像素的值的加權組合,權重系數(shù)w(i,j,k,l)取決于定義域核和值域核的乘積,同時考慮了空間域與值域的差別,而Gaussian Filter和α均值濾波分別只考慮了空間域和值域差別。

雙邊濾波原理(Bilateral Filtering)

基本思路

雙邊濾波(bilateral filtering)的基本思路是同時考慮將要被濾波的像素點的空域信息(domain)和值域信息(range)。因此是一種 combined 濾波方式,因此叫做 bilateral ,即同時考慮兩方面的信息。首先,對于圖像濾波來說,一個通常的intuition是:(自然)圖像在空間中變化緩慢,因此相鄰的像素點會更相近。但是這個假設在圖像的邊緣處變得不成立。如果在邊緣處也用這種思路來進行濾波的話,即認為相鄰相近,則得到的結果必然會模糊掉邊緣,這是不吼的,因此考慮再利用像素點的值的大小進行補充,因為邊緣兩側的點的像素值差別很大,因此會使得其加權的時候權重具有很大的差別,從而使得只考慮自己所屬的一邊的鄰域??梢岳斫獬上雀鶕?jù)像素值對要用來進行濾波的鄰域做一個分割或分類,再給該點所屬的類別相對較高的權重,然后進行鄰域加權求和,得到最終結果。

實現(xiàn)原理

在 bilateral filtering 中,兩個要素即:closeness 和 similarity ,或者說 domain 和 range ,或者 geometric 和 photometric ,其數(shù)學表達方式相近,如下:

其中積分號前面為歸一化因子,這里考慮對所有的像素點進行加權,c 和 s 是 closeness 和 similarity 函數(shù),x 代表要求的點,f (x) 代表該點的像素值。f(x) –》 h(x) 為濾波前后的image。我們最后的濾波函數(shù)為

由于domain component,使得濾波特性較好,由于range component,使得crisp edge 可以保持。

下圖示意了有邊緣的時候的權重和最后的濾波結果,可以看出權重在邊界有很明顯的分界,從而幾乎只對自己所屬的邊緣一側的像素點進行加權。

實現(xiàn) c 和 s 兩個函數(shù)的一種方法即 Gaussian 核,決定其性質的為各自的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仿真效果:

原圖

雙邊濾波器

對比一下高斯模糊濾波器

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 雙邊濾波
    +關注

    關注

    0

    文章

    4

    瀏覽量

    2047
收藏 人收藏

    評論

    相關推薦

    數(shù)字濾波器的設計和實現(xiàn)

    濾波器設計是一個創(chuàng)建滿足指定濾波要求的濾波器參數(shù)的過程。濾波器實現(xiàn)包括濾波器結構選擇和
    的頭像 發(fā)表于 10-31 10:38 ?1366次閱讀
    數(shù)字<b class='flag-5'>濾波器</b>的設計和<b class='flag-5'>實現(xiàn)</b>

    想用FPGA實現(xiàn)雙邊濾波算法,有懂得能說一下具體的實現(xiàn)步驟嗎

    想用FPGA實現(xiàn)雙邊濾波算法,有懂得能說一下具體的實現(xiàn)步驟嗎
    發(fā)表于 03-21 15:41

    一種快速Bilateral濾波器的設計與實現(xiàn)

    本文提出了一種Bilateral濾波器的快速算法。在算法的設計上,首先對空間鄰近度函數(shù)建立一組動態(tài)掩模,代替原始耗時的逐點運算,時間降至原有時間的三分之二;再離散化亮度相似
    發(fā)表于 09-12 16:03 ?4次下載

    一種改進的增維型雙邊濾波的快速算法

    一種改進的增維型雙邊濾波的快速算法_李俊峰
    發(fā)表于 01-07 16:00 ?0次下載

    采用密度k_means和改進雙邊濾波的點云自適應去噪算法_郭進

    采用密度k_means和改進雙邊濾波的點云自適應去噪算法_郭進
    發(fā)表于 03-19 18:58 ?1次下載

    詳細解析濾波器的定義,濾波器的特性,濾波器的工作原理,濾波器的分類,濾波器的典型電路原理圖

    濾波器的基礎是諧振電路,只要能構成諧振電路組合就可實現(xiàn)濾波器。濾波器有4種基本原型,即低通濾波器、帶通
    發(fā)表于 05-03 16:20 ?1.7w次閱讀
    詳細解析<b class='flag-5'>濾波器</b>的定義,<b class='flag-5'>濾波器</b>的特性,<b class='flag-5'>濾波器</b>的工作原理,<b class='flag-5'>濾波器</b>的分類,<b class='flag-5'>濾波器</b>的典型電路原理圖

    雙邊濾波點云去噪算法

    對三維點云數(shù)據(jù)進行曲率估計,并對現(xiàn)有點云雙邊濾波進行改進,增強其魯棒性和保特征性;最后使用改進的雙邊濾波對小尺度噪聲進行光順,實現(xiàn)三維點云數(shù)
    發(fā)表于 01-05 10:51 ?2次下載
    <b class='flag-5'>雙邊</b><b class='flag-5'>濾波</b>點云去噪算法

    圖像處理基礎(5):雙邊濾波器

    空域信息和灰度相似性,達到保邊去噪的目的。 雙邊濾波器之所以能夠做到在平滑去噪的同時還能夠很好的保存邊緣(Edge Preserve),是由于其濾波器的核由兩個函數(shù)生成: ? 一個函數(shù)由像素歐式距離決定
    發(fā)表于 09-06 20:39 ?742次閱讀

    如何進行雙邊濾波的圖像處理算法研究

    濾波是圖像處理和計算機視覺中最基本的操作,高斯低通濾波是最常用的,其原理是鄰域內像素值的加權平均。這種鄰域內的平均會使一些邊界被平均掉而使圖像出現(xiàn)模糊,雙邊濾波正是為了解決邊緣模糊的問
    發(fā)表于 12-21 09:53 ?56次下載
    如何進行<b class='flag-5'>雙邊</b><b class='flag-5'>濾波</b>的圖像處理算法研究

    雙邊帶調制原理_雙邊帶調制的優(yōu)缺點

    如果輸入的基帶信號沒有直流分量,且是理想帶通濾波,則得到的輸出信號便是無載波分量的雙邊帶信號,或稱雙邊帶抑制載波(DSB-SC)信號,簡稱DSB信號。
    的頭像 發(fā)表于 03-11 09:06 ?2.2w次閱讀
    <b class='flag-5'>雙邊</b>帶調制原理_<b class='flag-5'>雙邊</b>帶調制的優(yōu)缺點

    LabVIEW:適合點云平滑的雙邊濾波器

    的尖銳特征信息至關重要。本文設計了一種適合點云平滑的雙邊濾波器,既可以高效的去除噪音,又可以保留物體尖銳特性。 背景介紹: 對三維采集設備獲取的點云進行去噪平滑處理是當今幾何處理研究中最重要的任務之一。實際上獲
    的頭像 發(fā)表于 11-05 18:16 ?3389次閱讀
    LabVIEW:適合點云平滑的<b class='flag-5'>雙邊</b><b class='flag-5'>濾波器</b>

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

    空間濾波器的調整取決于濾波器的類型,比如均值濾波器可以調整濾波器的大小,中值濾波器可以調整濾波器
    發(fā)表于 02-16 09:40 ?870次閱讀
    空間<b class='flag-5'>濾波器</b>matlab<b class='flag-5'>實現(xiàn)</b>

    高通濾波器和低通濾波器的關系

    高通濾波器和低通濾波器是互補的,它們可以組合使用,從而實現(xiàn)更復雜的濾波功能。例如,可以將高通濾波器和低通
    發(fā)表于 02-17 17:47 ?4421次閱讀

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

    電子發(fā)燒友網(wǎng)站提供《如何使用HLS加速FPGA上的FIR濾波器.zip》資料免費下載
    發(fā)表于 06-14 15:28 ?3次下載
    如何使用<b class='flag-5'>HLS</b>加速FPGA上的FIR<b class='flag-5'>濾波器</b>

    高斯濾波雙邊濾波的區(qū)別

    高斯濾波雙邊濾波在圖像處理中都是常用的平滑濾波技術,但它們之間存在一些顯著的區(qū)別。以下是兩者之間的主要區(qū)別: 一、基本原理 高斯濾波
    的頭像 發(fā)表于 09-29 09:37 ?136次閱讀