跳转到主要内容

高斯滤波之FPGA实现

demi 提交于

<font color="#FD8900">作者:romme</font>

<font size="4" style="line-height: 40px;" color="red"><strong>1 基本概念</strong></font>

滤波,即强调图像中的某些特征,或者去除图像中某些不需要的信息。例如:图像去燥、图像增强、边缘检测等。

滤波是一个邻域操作算子。通常,邻域选择3x3,5x5等,这些3x3或者5x5的邻域,被称作滤波器,掩模或核。利用给定像素邻域内的像素值与掩模做卷积,从而决定该像素的最终输出值。

介绍高斯滤波之前,先从均值滤波说起。

均值滤波,即用掩模确定的领域内像素的平均灰度值代替原像素值。

但是,均值滤波在滤除噪声的同时,也会带来模糊边缘的负面效应。如果使用简单平均,显然不是很合理,因为图像都是连续的,越靠近的点关系越密切,越远离的点关系越疏远。因此,加权平均更合理,那么应该如何分配权重呢?

这时,我们就引入了高斯滤波。

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声。那么,何谓高斯噪声?

高斯噪声就是它的概率密度函数服从高斯分布(即正态分布)的一类噪声。

高斯滤波器,即根据高斯函数的形状来选择权值的线性平滑滤波器。接着,介绍高斯函数和高斯核。

<strong>高斯函数</strong>

(1)一维高斯分布

<center><img src="http://xilinx.eetrend.com/files/2019-11/wen_zhang_/100046151-84778-1.jp…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2019-11/wen_zhang_/100046151-84779-2.jp…; alt=""></center><br>

(2)二维高斯分布

<center><img src="http://xilinx.eetrend.com/files/2019-11/wen_zhang_/100046151-84780-3.jp…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2019-11/wen_zhang_/100046151-84781-4.jp…; alt=""></center><br>

<strong>高斯核</strong>

为了计算权重矩阵,需要设定σ的值。假定σ=1.5,则模糊半径为1的权重矩阵如下:

<center><img width="600" src="http://xilinx.eetrend.com/files/2019-11/wen_zhang_/100046151-84782-5.jp…; alt=""></center><br>

这9个点的权重总和等于0.4787147,这时我们还要确保这九个点加起来为1(高斯模板的特性),因此上面9个值还要分别除以0.4787147,得到最终的高斯核。

<center><img src="http://xilinx.eetrend.com/files/2019-11/wen_zhang_/100046151-84783-6.jp…; alt=""></center><br>

<font size="4" style="line-height: 40px;" color="red"><strong>2 高斯滤波计算</strong></font>

有了高斯核,下面的计算就简单了。

在掩模领域内,将9个点分别乘以对应的高斯核权重值,将这9个值加起来,就是中心点的高斯滤波后的值。对所有点重复这个过程,就得到了高斯模糊后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯模糊。

<font size="4" style="line-height: 40px;" color="red"><strong>3 FPGA实现</strong></font>

(1)缓存图像数据;
(2)做卷积;
(3)映射输出。

实现效果如下:
<center><img src="http://xilinx.eetrend.com/files/2019-11/wen_zhang_/100046151-84785-7.jp…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2019-11/wen_zhang_/100046151-84786-8.jp…; alt=""></center><br>

<font size="4" style="line-height: 40px;" color="red"><strong>4 补充说明</strong></font>

(1)如果一个点处于边界,周边没有足够的点,怎么办?(可以把已有的点映射到另一面的对应位置,构成完整的掩模)

(2)高斯滤波采用加权平均思想,距离越近的点权重越大,距离越远的点权重越小。但是,这个假设在图像的边缘处变得不成立。如果在边缘处也用这种思路来滤波的话,即认为相邻相近,则得到的结果必然会模糊掉边缘,这是不合理的。这就涉及到另外一种滤波算法,双边滤波。

(3)高斯滤波器宽度(决定着平滑程度)是由参数σ表征的。σ越大,高斯滤波器的频带就越宽,平滑程度就越好。可以通过调节平滑程度参数σ,来达到希望的滤波效果。

本文转自: <a href="https://mp.weixin.qq.com/s/-YTF1KTZ-4PsdgY3yWfPIQ">FPGA干货架</a&gt;,作者:romme
*本文由FPGA干货架授权转发,如需转载请联系作者本人