1.高斯滤波算法的实现
前面讲的均值/中值滤波,对于滤波窗口内每个像素的权重都是一样的。但是噪声在图像当中常表现为异常视觉效果的孤立像素点或像素块,那么他必然不是平均分布。
这里先引入一个概念:正态分布:
正态分布是最重要的一种概率分布,相关概念是由德国的数学家和天文学家Moivre在1733年提出的,但由于德国数学家Gauss率先将其用于天文学研究,因此也叫做高斯分布。在正态分布里,认为中间状态是常态,过高和过低都属于少数,因此正态分布具有相当的普遍性,典型的比如我们的身高、寿命、血压、成绩、测量误差等都遵从正太分布。
以中国家庭动态跟踪,抽样掉找自报的身高数据为例,如下是2010年男/女身高分布直方图,近似呈现正态分布。
扯远了,回归正题,我们这里主题就是要处理高斯分布的噪声,与椒盐噪声不同,高斯噪声则是画面上每个点都存在着不同程度的,与当前像素距离成高斯分布的噪声。这里我们继续在前文已经成熟的3*3滑窗方案上,进行高斯算法的讲解,及Matlab&FPGA的实现。
2.高斯滤波算法理论
根据概率论及中心极限定理(MBA智库百科,全球专业中文经管百科)猜想,大部分噪声应该也符合正态分布/高斯分布(高斯白噪声),所以也就有了高斯滤波,及根据正态分布进行权重计算的滤波方法。
我们已经介绍了高斯分布(正态分布),此处我们直接引入高斯分布函数,为一维与二维高斯分布函数,其中σ为高斯分布的强度,σ越大则数据更越分散,反之则越向中心集中分布:
我们首先采用Matlab自带的高斯函数来验证一下结果,σ=1的高斯滤波,可见有一定的模糊效果。图3为5*5的窗口,σ=3的高斯滤波,模糊的强度稍微更大了一点。图4为11*11的窗口,σ=3的高斯滤波,相对5*5窗口,σ=3的滤波,可见扩大扩大窗口后,滤波后模糊程度非常大,可见滤波窗口对滤波的强度影响更大,其次才是σ的大小。
左侧为生成5*5模板的Matlab代码,我们先根据高斯分布的公式生成5*5 的模板。其中11行为原始二维高斯分布的函数,而12行中我已经将常熟去掉,毕竟后续需要归一化,就可以简化公式,得到的高斯权重分布如有图G1所示,为一堆浮点数据。
但是,二维高斯分布并不仅仅在5*5的区间内,权重在5*5之外仍然有分布,只不过我们当前采用5*5的高斯分布,权且认为数据主要分布在5*5之内,因此还需要进一步的归一化,来使得所有权中之和=1,如17-18行所示,得到右边第二个表格数据的模板。
如果在Matlab中实现,此时得到的模板已经可以用于高斯滤波卷积计算。但我们的目标是FPGA实现,因此还需要进一步定点化,这里采用*1024为例,生成最终的5*5的模板如上第三个表格所示。当然最后需要/1024缩放回去,使得结果最终还原到0-255。
为Matlab进行5*5高斯模板卷积的源代码,其中IMG1为原图,IMG2为采用Matlab自带高斯滤波函数在σ=3,5*5窗口下的滤波结果,IMG3为我们手动编写的,根据生成的定点化模板卷积后的结果。
其中在处理5*5卷积时,为了设计的简便,边缘像素采用了复制原值的操作。另外,由于Matlab是浮点运算,在卷积后将数据类型再次转成uint8定点。最后执行生成的结果如下图所示,其中图2为与图3,处理结果几乎一样,我们定点化5*5高斯模板算法成功。
责任编辑:haq
全部0条评论
快来发表一下你的评论吧 !