HLS实现Bilateral Filtering双边滤波器

 HLS实现Bilateral Filtering双边滤波器

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

双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合,

权重系数w(i,j,k,l)取决于定义域核

和值域核

的乘积

同时考虑了空间域与值域的差别,而Gaussian Filter和α均值滤波分别只考虑了空间域和值域差别。
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仿真效果:

原图

原图

双边滤波器

双边滤波器

对比一下高斯模糊滤波器

对比一下高斯模糊滤波器

用户喜欢...

在不需要大量使用资源的情况下为HMI实现带来新的维度

十多年前,iPhone的推出预示着我们日常生活中几个关键要素的大变革。这些改变游戏规则的手机将在我们如何立即与技术互动方面发挥关键作用 - 即通过使用触摸。虽然触摸屏在此之前已经存在...


使用微控制器的功能,在紧凑设计中快速实现模拟信号链

许多针对物联网 (IoT) 的设计都依靠模拟电路,以便满足应用对传感器和致动器的信号调节、电流控制和其他功能的独特要求。虽然专用的信号链 IC 可以满足这种需求,但是成本和空间严格受限...


在嵌入式系统中快速实现高效的实时时钟/日历功能

许多嵌入式应用需要知道时间,以便在特定的时间和日期,或针对时间戳事件,或同时依据两者执行特定的任务。执行此功能的 RTCC(实时时钟和日历)芯片问世已有数十年,但设计人员在缩减...


使用Xilinx系统生成器实现简单的DDS

在本文中,我们将讨论使用Xilinx System Generator实现简单的直接数字频率合成器(DDS)。 System Generator是一个功能强大的工具,它将Xilinx FPGA设计过程与MATLAB的Simulink集成,后者使用高级描述轻松实...


LVDS高速ADC接口, Xilinx FPGA实现

LVDS 即Low-Voltage Differential Signaling。FPGA的selecteIO非常强大,支持各种IO接口标准,电压电流都可以配置。其接口速率可以达到几百M甚至上千M。使用lvds来接收高速ADC产生的数据会很方便。像IS...


在Digilent Nexys Video Artix-7板卡上实现HDMI I/O视频处理系统

嵌入式视觉是当今科技最激动人心的领域之一。 关于使用Zynq SoC的嵌入式视觉应用,热心群众们说的太多,我就不赘述了。今天我们换一个新的视角,来看看如何使用纯FPGA来实现嵌入式视觉...


单片机实现洗浴服务机器人的控制系统设计

目前,中国已经进入了老龄化社会,预计从2020年开始,中国将步入老龄化严重阶段;2050年中国将步入超高老龄化国家行列,60岁以上人口将占到30%左右。全国约有1400多万老年人将进入老年...


经典重现!基于Spartan-7/3 FPGA实现MOS Technology 6502克隆版

背景: 曾经在泡泡网CPU上看到,国外媒体曾评出过迄今为止最具影响力的11款微处理器,其中第五款就是 MOS Technology 6502 (1975年)。6502是一款功能强大且价格低廉的处理器产品,当时英特尔8...


单片机实现低成本A/D转换

本文向大家介绍低成本的A/D转换的一种方法,只是这种方法成本会更低,而且外部无需使用比较器。此种方法的A/D转换精度不高,只有6~7bit,并且被测电压范围较为有限,但在某些精度要求...


借助PowerVR GPU和OpenCL实现人脸检测和识别

作者:Ashley Smith 在前面的文章中,我们向大家展示了使用神经网络实现一些诸如物体识别、数字化识别等功能。本篇文章我们将向大家展示视觉处理方面更实际的一个Demo,在PowerVR GPU上运行...


基于微处理器的车载导航电子地图的设计和实现

车辆远程诊断仪的主要功能是导航。导航功能的重点是行车路线设计、自动车辆定位、综合信息服务、路径引导服务等。导航功能是GIS技术、通讯技术、嵌入式技术和GPS定位等技术相结合的综...


Vivado中异步FIFO的实现和使用

FIFO应用: 1、在千兆以太网数据写入,往DDR3里面写数据时候 2、AD采样时钟和内部时钟不同时,需要FIFO进行转换 3、同频异相时也需要用FIFO进行转换 Vivado中FIFO generator的配置方法 1、 2、stan...


开源工具助你在FPGA上轻松实现二值化神经网络

神经网络技术起源于上世纪五、六十年代,当时叫感知机,拥有输入层、输出层和一个隐含层。输入的特征向量通过隐含层变换达到输出层,在输出层得到分类结果,早期感知机的推动者是...


FPGA滤波器几种舍入方式和误差分析及verilog实现

1.舍入与截尾误差,补码截尾,会有负的直流偏置; FPGA二进制几种截尾和舍入方法比较: wire signed [15:0] scaletypeconvert1; wire signed [37:0] scale1; 1.Round Mode: fix——filter_zero scaletypeconvert1= $signed({s...


基于ARM7核的线缆自动测试仪的设计实现

在现代装甲通信指挥装备中,功能强大、控制精确、运行可靠的装备,均由越来越多的电子分机、部件通过密集的线缆、线束、网络连接而成。 线缆、网络连接的正确性和可靠性,在保障整...


STM32 的高速 USB 信号质量测试实现

STM32 提供了丰富的接口资源,其中包括 USB FS、USB HS、OTG FS 和 OTG HS。对于高速 USB,由于信号速率相对较高。在开发过程中,会对高速 USB 信号质量进行测试,例如运用广泛的眼图测试。STM32...