目录

简介

数学实现

FPGA实现

数据输入

窗口生成

算法实现

数据输出

总结


简介

        双边滤波包含两个滤波的计算,一个是负责平滑图像的高斯滤波(空间域),是二维高斯正态分布放在图像矩阵上做卷积运算;如果在图像的边缘区域,像素差异本身就较大,只用空间域的滤波会导致图像模糊,所以加入值域滤波,因为边缘像素差异大,使得其加权的时候权重具有很大的差别,从而使得只考虑自己所属的一边的邻域,类似于分割图像。两个权值的乘积再和原图做卷积运算得到优化后的结果,从而达到保边去噪的效果。

数学实现

双边滤波公式

FPGA图像识别是干什么的_FPGA图像识别是干什么的

其中

FPGA图像识别是干什么的_图像处理_02


FPGA图像识别是干什么的_fpga开发_03

其中

FPGA图像识别是干什么的_fpga开发_04

是滤波后的图像;

FPGA图像识别是干什么的_权值_05

是原始图;

FPGA图像识别是干什么的_权值_06

是当前要滤波的像素;

FPGA图像识别是干什么的_算法_07


FPGA图像识别是干什么的_权值_06

的窗口;

FPGA图像识别是干什么的_图像处理_09

是一个值域核;

FPGA图像识别是干什么的_fpga开发_10

是空间域核;设

FPGA图像识别是干什么的_FPGA图像识别是干什么的_11

是滤波核内的某点,

FPGA图像识别是干什么的_FPGA图像识别是干什么的_12

是滤波核中心点,令,

        

权值即

FPGA图像识别是干什么的_图像处理_09

*

FPGA图像识别是干什么的_fpga开发_10

可以看到在边缘部分,像素差距大, 

FPGA图像识别是干什么的_图像处理_09

趋近0,对结果的影响越小,保持边缘;图像平滑部分,

FPGA图像识别是干什么的_图像处理_09

趋近1,主要是

FPGA图像识别是干什么的_fpga开发_10

起作用。

FPGA实现

本试验实现5x5窗口的双边滤波,相对于输入时钟,用五倍以上的时钟去处理(一次处理五个像素)。模块主要包括数据输入缓存、窗口生成,数据处理,数据输出三部分。

数据输入

数据输入模块主要是把低速的图像数据缓存,然后通过高速时钟读出数据进行处理。

窗口生成

窗口生成较为简单,通过shift reg缓存四行

算法实现

首先需要生成空间域和值域的高斯核,存入rom,作为查找表。

空间域:空间域实现较为简单,只要25个欧式距离所对应的权重值即可,根据输入像素所在的位置查找对应的值。通过matlab生成,函数即

FPGA图像识别是干什么的_fpga开发_10

所示。值域:值域的权重,像素与中间点的差值作为索引(假设像素为14bit,差值为0~16383),根据

FPGA图像识别是干什么的_图像处理_09

函数得到值域的权重查找表存到rom。

25个像素一列一列输出,一列是5个像素,五个值域查找表可同时输出五个查找值,空间域不需要五个查找表,可通过输出列所在的位置得到,然后通过流水线计算。

一级:像素差值计算,以及空间域权值索引得到空间域权值

FPGA图像识别是干什么的_fpga开发_10

  ,缓存当前列的像素值。二级:像素差值索引得到值域权值

FPGA图像识别是干什么的_图像处理_09

,以及空间域权值缓存,缓存当前列的像素值。三级:值域权值、空间域权值、像素值乘积fgi_0 =

FPGA图像识别是干什么的_图像处理_09

FPGA图像识别是干什么的_权值_05

FPGA图像识别是干什么的_权值_24

,以及值域权值和空间域权值乘积fg_0 =

FPGA图像识别是干什么的_图像处理_09

FPGA图像识别是干什么的_权值_24

。 四级:计算上述两个乘积的和(单列),sum_fgi_0 =

FPGA图像识别是干什么的_FPGA图像识别是干什么的_27

fgi  (fgi_0,fgi_1...fgi_4),以及 sum_fg_0 =

FPGA图像识别是干什么的_FPGA图像识别是干什么的_27

fg     (fg_0,fg_1...fg_4)。

五级:计算五个列的总的和。

六级:计算比值(除法器)。

 上述计算需要注意位宽以及定点数等

数据输出

 数据存入fifo后通过低速时钟读出

 

总结

本算法需要计算较多卷积,以及对参数的归一化定点计算也要考虑到,主要难点是有点绕,需要仔细。本文没有讨论

FPGA图像识别是干什么的_算法_29

的选取。可以参考双边滤波原理(Bilateral Filtering) - 知乎