图像算法--基于fpga的双边滤波算法

目录

简介

数学实现

FPGA实现

数据输入

窗口生成

算法实现

数据输出

总结


简介

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

数学实现

双边滤波公式

I^{flitered}(x)=\frac{1}{W_{p}}\sum_{x_{i}\epsilon \Omega }^{}I(x_{i})f_{r}(\left \| I(x_{i})-I(x) \right \|)g_{s}(\left \| x_{i}-x \right \|)

其中W_{p}

\sum_{x_{i}\epsilon \Omega }^{}f_{r}(\left \| I(x_{i})-I(x) \right \|)g_{s}(\left \| x_{i}-x \right \|)

其中I^{filtered}是滤波后的图像;

I是原始图;

x是当前要滤波的像素;

\Omegax的窗口;

f_{r}是一个值域核;

g_{s}是空间域核;

(x_{i},y_{i})是滤波核内的某点,(x_{c},y_{c})是滤波核中心点,

令,g_{s}=e^{-\frac{(x_{i}-x_{c})^{2}+(y_{i}-y_{c})^{2}}{2\sigma_{d} ^{2}}}

        f_{r}=e^{-\frac{(gray(x_{i},y_{i})-gray(x_{c}-y_{c}))^{2}}{2\sigma_{r} ^{2}}}

权值即f_{r}*g_{s}

可以看到在边缘部分,像素差距大, f_{r}趋近0,对结果的影响越小,保持边缘;图像平滑部分,f_{r}趋近1,主要是g_{s}起作用。

FPGA实现

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

数据输入

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

窗口生成

窗口生成较为简单,通过shift reg缓存四行,主要参考了生成3x3矩阵(2):FIFO法的分析和改进 - 咸鱼FPGA - 博客园

算法实现

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

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

值域:值域的权重,像素与中间点的差值作为索引(假设像素为14bit,差值为0~16383),根据f_{r}函数得到值域的权重查找表存到rom。

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

一级:像素差值计算,以及空间域权值索引得到空间域权值g_{s}  ,缓存当前列的像素值。

二级:像素差值索引得到值域权值f_{r},以及空间域权值缓存,缓存当前列的像素值。

三级:值域权值、空间域权值、像素值乘积fgi_0 = f_{r}Ig_s,以及值域权值和空间域权值乘积fg_0 = f_{r}g_s。 

四级:计算上述两个乘积的和(单列),sum_fgi_0 = \sumfgi  (fgi_0,fgi_1...fgi_4),以及 sum_fg_0 = \sumfg     (fg_0,fg_1...fg_4)。

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

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

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

数据输出

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

 

总结

本算法需要计算较多卷积,以及对参数的归一化定点计算也要考虑到,主要难点是有点绕,需要仔细。本文没有讨论\sigma的选取。可以参考双边滤波原理(Bilateral Filtering) - 知乎

 

 

你可能感兴趣的:(fpga,数字图像处理,算法,fpga开发,图像处理)