0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

双边滤波原理_HLS实现Bilateral Filtering双边滤波器

Hx 作者:工程师陈翠 2018-06-29 08:19 次阅读

双边滤波(Bilateral filter)是一种可以保边去噪的滤波器。之所以可以达到此去噪效果,是因为滤波器是由两个函数构成。一个函数是由几何空间距离决定滤波器系数。另一个由像素差值决定滤波器系数。

双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合,权重系数w(i,j,k,l)取决于定义域核和值域核的乘积,同时考虑了空间域与值域的差别,而Gaussian Filter和α均值滤波分别只考虑了空间域和值域差别。

双边滤波原理(Bilateral Filtering)

基本思路

双边滤波(bilateral filtering)的基本思路是同时考虑将要被滤波的像素点的空域信息(domain)和值域信息(range)。因此是一种 combined 滤波方式,因此叫做 bilateral ,即同时考虑两方面的信息。首先,对于图像滤波来说,一个通常的intuition是:(自然)图像在空间中变化缓慢,因此相邻的像素点会更相近。但是这个假设在图像的边缘处变得不成立。如果在边缘处也用这种思路来进行滤波的话,即认为相邻相近,则得到的结果必然会模糊掉边缘,这是不吼的,因此考虑再利用像素点的值的大小进行补充,因为边缘两侧的点的像素值差别很大,因此会使得其加权的时候权重具有很大的差别,从而使得只考虑自己所属的一边的邻域。可以理解成先根据像素值对要用来进行滤波的邻域做一个分割或分类,再给该点所属的类别相对较高的权重,然后进行邻域加权求和,得到最终结果。

实现原理

在 bilateral filtering 中,两个要素即:closeness 和 similarity ,或者说 domain 和 range ,或者 geometric 和 photometric ,其数学表达方式相近,如下:

其中积分号前面为归一化因子,这里考虑对所有的像素点进行加权,c 和 s 是 closeness 和 similarity 函数,x 代表要求的点,f (x) 代表该点的像素值。f(x) –》 h(x) 为滤波前后的image。我们最后的滤波函数为

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

下图示意了有边缘的时候的权重和最后的滤波结果,可以看出权重在边界有很明显的分界,从而几乎只对自己所属的边缘一侧的像素点进行加权。

实现 c 和 s 两个函数的一种方法即 Gaussian 核,决定其性质的为各自的sigma参数,即 σ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仿真效果:

原图

双边滤波器

对比一下高斯模糊滤波器

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 双边滤波
    +关注

    关注

    0

    文章

    4

    浏览量

    2052
收藏 人收藏

    评论

    相关推荐

    数字滤波器的设计和实现

    滤波器设计是一个创建满足指定滤波要求的滤波器参数的过程。滤波器实现包括滤波器结构选择和
    的头像 发表于 10-31 10:38 1560次阅读
    数字<b class='flag-5'>滤波器</b>的设计和<b class='flag-5'>实现</b>

    想用FPGA实现双边滤波算法,有懂得能说一下具体的实现步骤吗

    想用FPGA实现双边滤波算法,有懂得能说一下具体的实现步骤吗
    发表于 03-21 15:41

    一种快速Bilateral滤波器的设计与实现

    本文提出了一种Bilateral滤波器的快速算法。在算法的设计上,首先对空间邻近度函数建立一组动态掩模,代替原始耗时的逐点运算,时间降至原有时间的三分之二;再离散化亮度相似
    发表于 09-12 16:03 4次下载

    一种改进的增维型双边滤波的快速算法

    一种改进的增维型双边滤波的快速算法_李俊峰
    发表于 01-07 16:00 0次下载

    采用密度k_means和改进双边滤波的点云自适应去噪算法_郭进

    采用密度k_means和改进双边滤波的点云自适应去噪算法_郭进
    发表于 03-19 18:58 1次下载

    详细解析滤波器的定义,滤波器的特性,滤波器的工作原理,滤波器的分类,滤波器的典型电路原理图

    滤波器的基础是谐振电路,只要能构成谐振电路组合就可实现滤波器滤波器有4种基本原型,即低通滤波器、带通
    发表于 05-03 16:20 1.8w次阅读
    详细解析<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>的典型电路原理图

    双边滤波点云去噪算法

    对三维点云数据进行曲率估计,并对现有点云双边滤波进行改进,增强其鲁棒性和保特征性;最后使用改进的双边滤波对小尺度噪声进行光顺,实现三维点云数
    发表于 01-05 10:51 2次下载
    <b class='flag-5'>双边</b><b class='flag-5'>滤波</b>点云去噪算法

    图像处理基础(5):双边滤波器

    空域信息和灰度相似性,达到保边去噪的目的。 双边滤波器之所以能够做到在平滑去噪的同时还能够很好的保存边缘(Edge Preserve),是由于其滤波器的核由两个函数生成: • 一个函数由像素欧式距离决定
    发表于 09-06 20:39 766次阅读

    如何进行双边滤波的图像处理算法研究

    滤波是图像处理和计算机视觉中最基本的操作,高斯低通滤波是最常用的,其原理是邻域内像素值的加权平均。这种邻域内的平均会使一些边界被平均掉而使图像出现模糊,双边滤波正是为了解决边缘模糊的问
    发表于 12-21 09:53 56次下载
    如何进行<b class='flag-5'>双边</b><b class='flag-5'>滤波</b>的图像处理算法研究

    双边带调制原理_双边带调制的优缺点

    如果输入的基带信号没有直流分量,且是理想带通滤波,则得到的输出信号便是无载波分量的双边带信号,或称双边带抑制载波(DSB-SC)信号,简称DSB信号。
    的头像 发表于 03-11 09:06 2.3w次阅读
    <b class='flag-5'>双边</b>带调制原理_<b class='flag-5'>双边</b>带调制的优缺点

    LabVIEW:适合点云平滑的双边滤波器

    的尖锐特征信息至关重要。本文设计了一种适合点云平滑的双边滤波器,既可以高效的去除噪音,又可以保留物体尖锐特性。 背景介绍: 对三维采集设备获取的点云进行去噪平滑处理是当今几何处理研究中最重要的任务之一。实际上获
    的头像 发表于 11-05 18:16 3480次阅读
    LabVIEW:适合点云平滑的<b class='flag-5'>双边</b><b class='flag-5'>滤波器</b>

    空间滤波器matlab实现

    空间滤波器的调整取决于滤波器的类型,比如均值滤波器可以调整滤波器的大小,中值滤波器可以调整滤波器
    发表于 02-16 09:40 903次阅读
    空间<b class='flag-5'>滤波器</b>matlab<b class='flag-5'>实现</b>

    高通滤波器和低通滤波器的关系

    高通滤波器和低通滤波器是互补的,它们可以组合使用,从而实现更复杂的滤波功能。例如,可以将高通滤波器和低通
    发表于 02-17 17:47 4886次阅读

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

    电子发烧友网站提供《如何使用HLS加速FPGA上的FIR滤波器.zip》资料免费下载
    发表于 06-14 15:28 3次下载
    如何使用<b class='flag-5'>HLS</b>加速FPGA上的FIR<b class='flag-5'>滤波器</b>

    高斯滤波双边滤波的区别

    高斯滤波双边滤波在图像处理中都是常用的平滑滤波技术,但它们之间存在一些显著的区别。以下是两者之间的主要区别: 一、基本原理 高斯滤波
    的头像 发表于 09-29 09:37 393次阅读