基于FPGA的中值滤波算法实现

         在这一篇开篇之前,我需要解决一个问题,上一篇我们实现了基于FPGA的均值滤波算法的实现,最后的显示效果图上发现有一些黑白色的斑点,我以为是椒盐噪声,然后在做基于FPGA的中值滤波算法的实验时,我发现黑白斑点并没有消除,中值滤波本来是可以很好的滤掉椒盐噪声,所以说这里并不是椒盐噪声,最后经过我仔细的检查,终于明白了问题的所在。我所使用的Xilinx这款开发板的晶振为125Mhz,串口模块我使用前面设计好的代码,输入时钟为50Mhz,产生的接收完成标志信号也就是一个50Mhz的时钟周期,我这里将接收完成标志作为,双口RAM的写使能,却把IP Core的时钟设置为125Mhz系统时钟,所以在wea有效期间,clka会有至少两次上升沿,所以在串口传输过程中,RAM写入的数据可能会有一部分出现偏差,所以最终显示出来有部分像素有问题。这里我修改如下。

  最后均值滤波的显示效果也是同样的,一幅完好的图片,和原图相比只是变模糊了一些,查看图片请跳至文末。

  在实时图像采集中,不可避免的会引入噪声,尤其是干扰噪声和椒盐噪声,噪声的存在严重影响边缘检测的效果,中值滤波是一种基于排序统计理论的非线性平滑计数,能有效平滑噪声,且能有效保护图像的边缘信息,所以被广泛用于数字图像处理的边缘提取,其基本原理是把数字图像或数字序列中的一点的值用该点邻域内所有点的中值来代替。

中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的。此外,中值滤波的算法比较简单,也易于用硬件实现。所以,中值滤波方法一经提出后,便在数字信号处理领得到重要的应用。

中值滤波方法是,对待处理的当前像素,选择一个模板,该模板为其邻近的若干个像素组成,对模板的像素由小到大进行排序,再用模板的中值来替代原像素的值的方法。

         当我们使用3x3窗口后获取领域中的9个像素,就需要对9个像素值进行排序,为了提高排序效率,排序算法思想如图3-18所示

(1)       对窗内的每行像素按降序排序,得到最大值、中间值和最小值;

(2)       把三行的最小值相比较,取其中的最大值;

(3)       把三行的最大值相比较,取其中的最小值;

(4)       把三行的中间值相比较,再取一次中间值;

(5)       把前面的到的三个值再做一次排序,获得的中值即该窗口的中值。

排序算法思想

  中值滤波的3x3矩阵的生成和均值滤波是完全类似的。我们求中值的方法是,先对3x3矩阵的每行按从大到小进行排序,然后利用排序法求出最大值那一列的最小值,求出之间数那一列的中间值,求出最小值按一列的最大值,最后将求出的三个值再排序,这三个值的中间值就是这个3x3矩阵的中间值。

中值滤波计算

如图所示仿真,可以推算出,这个中值完全是正确的,最后将求出的中值输出,这样中值定理便完成了。 

3x3矩阵的中值输出

         我们在求中值的时候消耗了三个时钟周期,最后输出写RAM使能信号时,需要将per_clken延时3个时钟周期,保证图像数据与写RAM使能对齐、同步性。这里延时的写法和前面文章中所讲的是完全相同的!

  中值滤波和均值滤波比较:中值滤波与均值滤波分别是非线性滤波和线性滤波的代表,这两种滤波非常的相似,但滤波的效果却有很大的差别,均值滤波相当于低通滤波,有将图像模糊化的趋势,对椒盐噪声基本无能为力。中值滤波的优点是可以很好的过滤椒盐噪声,缺点是容易造成图像的不连续。中值滤波有效的移植了最大值和最小值,图像会变得均匀,对椒盐噪声有很好的滤出效果!所以本系统最终选择采用中值滤波的方法。

灰度lena

均值滤波lena

中值滤波lena

  上图为灰度图,中间为均值滤波图像,下图为中值滤波后的图像。通过对比发现,均值滤波后的lena变得更模糊,亮度也变高,而中值滤波后的lena清晰度较好,也是有效的过滤掉了椒盐噪声,由于我们这是所选取的图片椒盐噪声不明显,感兴趣的读者可以自己去试着找一幅带椒盐噪声的图片去处理一下。这里需要强调的一下是滤波后的图像会有部分边缘缺失,这是因为我们在求取均值或中值时,生成的3x3矩阵,在缓存第一行数据时,第二三行数据是没有的,同样缓存到前两行第三行数据也是没有的,但这个时候我们就已经开始了求均值或中值的运算,那么这个时候输出的像素点其实是作废的,这里我们并没有过多的关心这些像素点,只是专注于学习中值滤波。

转载请注明出处:NingHeChuan(宁河川)

图像处理系列文章

第一篇:基于FPGA的VGA显示静态图片

第二篇:基于FPGA的RGB565_YCbCr_Gray算法实现

第三篇:基于FPGA的Uart接收图像数据至VGA显示

番外篇:数字图像处理界标准图像 Lena 后面的故事

第四篇:基于FPGA的均值滤波算法实现

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

AOE关键路径

这个算法来求关键路径,其实就是利用拓扑排序,首先求出,每个节点最晚开始时间,再倒退求每个最早开始的时间。 从而算出活动最早开始的时间和最晚开始的时间,如果这两个...

2637
来自专栏项勇

笔记68 | 切换fragmengt的replace和add方法笔记

1524
来自专栏拭心的安卓进阶之路

Java 集合深入理解(6):AbstractList

今天心情比天蓝,来学学 AbstractList 吧! ? 什么是 AbstractList ? AbstractList 继承自 AbstractCollec...

20910
来自专栏学海无涯

Android开发之奇怪的Fragment

说起Android中的Fragment,在使用的时候稍加注意,就会发现存在以下两种: v4包中的兼容Fragment,android.support.v4.ap...

3215
来自专栏java闲聊

JDK1.8 ArrayList 源码解析

当运行 ArrayList<Integer> list = new ArrayList<>() ; ,因为它没有指定初始容量,所以它调用的是它的无参构造

1242
来自专栏Hongten

ArrayList VS Vector(ArrayList和Vector的区别)_面试的时候经常出现

2302
来自专栏聊聊技术

原 数据结构-二叉搜索树(Binary S

2957
来自专栏MelonTeam专栏

ArrayList源码完全分析

导语: 这里分析的ArrayList是使用的JDK1.8里面的类,AndroidSDK里面的ArrayList基本和这个一样。 分析的方式是逐个API进行解析 ...

4739
来自专栏计算机视觉与深度学习基础

Leetcode 114 Flatten Binary Tree to Linked List

Given a binary tree, flatten it to a linked list in-place. For example, Given...

2098
来自专栏alexqdjay

HashMap 多线程下死循环分析及JDK8修复

1.2K4

扫码关注云+社区