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

  我们为了实现动态图像的滤波算法,用串口发送图像数据到FPGA开发板,经FPGA进行图像处理算法后,动态显示到VGA显示屏上,前面我们把硬件平台已经搭建完成了,后面我们将利用这个硬件基础平台上来实现基于FPGA的一系列图像处理基础算法。

  椒盐噪声(salt & pepper noise)是数字图像的一个常见噪声,所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素。椒盐噪声是一种因为信号脉冲强度引起的噪声,产生清楚该噪声的算法也比较简单。

  均值滤波的方法将数据存储成3x3的矩阵,然后求这个矩阵。在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围 8 个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

均值滤波

  如图所示,我们要进行均值滤波首先要生成一个3x3矩阵。算法运算窗口一般采用奇数点的邻域来计算中值,最常用的窗口有3X3和5X5模型。下面介绍3X3窗口的Verilog实现方法。

(1)       通过2个或者3个RAM的存储来实现3X3像素窗口;

(2)       通过2个或者3个FIFO的存储来实现3X3像素窗口;

(3)       通过2行或者3行Shift_RAM的存储来实现3X3像素窗口;

  要想用实现均值滤波和中值滤波,必须要先生成3x3阵列,在Altera系列里,可以用QuatusII调用IP核——shift_RAM,具体设置参数如图所示。

  如上图所示,其中shiftin是实时输入的数据,taps1x,taps2x输入数据的第二三行,当数据输入成一行三个时,自动跳到下一行,最终形成每行是三列的一个矩阵,用均值滤波和中值滤波的处理方法即可,这样基本是每一个目标都可以找到自己对应的一个3x3矩阵,最后进行处理。先进入IP核里面的是最开始的的数据,所以在读出的时候也是要放在第一行。

         Xilinx Vivado也有自己的Shift_RAM IP Core,不过这里只能缓存出来一行数据,我们这里需要两个Shift_RAM IP Core和正在输入的一行数据共同组成3行数据。这里调用两个Shift_RAM IP Core将这两个IP级联起来就行了。

  本系统主要用通过调用两个shift_register IP核来生成3X3矩阵实现3X3像素窗口。shift_register IP核可定义数据宽度、移位的行数、每行的深度。这里我们需要8bit。640个数据每行,同事移位寄存2行即可。同时选择时钟使能端口clken。如图所示。

像素数据移位寄存

我们这里将行设置为12,所以可以明显的看到,当数据缓存到一行时,就会移位寄存到下一行,缓存两行后便会生成3X3矩阵。

缓存的数据

比较缓存的第一行的数据在3x3矩阵中,占第一行,结果相同,显然是正确的。最终生成的3x3矩阵结果显然是正确的。

求总值

求均值

         我们在计算均值的时候采用两级流水线消耗了2个时钟周期,所以最后要将输给写RAM使能的数据缓存使能延时两个时钟周期!学到一个延时的新写法。

  将3x3矩阵的中心像素的周围八个点求和,我们这里还是采取流水线的设计方法,来增加吞吐量,然后再求平均值代替目标像素的值,这里读者可以自己思考怎么设计,从波形图上观察,计算的结果显然是正确的。这样便完成了均值滤波的仿真。

我们来看一下板级测试视频:http://t.cn/RCJxiGF

  最后我们来比较一下显示效果,上图为灰度图像,下图为均值滤波后的图像,可以看出滤波后的图像有一些模糊,这是因为均值滤波就是将图像做平滑处理,像素值高的像素会被拉低,像素值低像素会被拉高,趋向于一个平均值,所以图像会变模糊一些。而且细心的人可以把图片放大会看到,图片上会有几个白黑点,这其实就是椒盐噪声,我们文章开头也说过了,椒盐噪声(salt & pepper noise)是数字图像的一个常见噪声,所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素。均值滤波相当于低通滤波,有将图像模糊化的趋势,对椒盐噪声基本无能力,所以显示的图片上会留下一些黑白点。下一篇我会发布基于FPGA的中值滤波处理,并且比较这两种滤波方式的优劣,最终选取较好的一种滤波方式进行图像边缘检测处理。

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

业界 | Facebook开源Mask R-CNN的PyTorch 1.0基准,比mmdetection更快、更省内存

项目地址:https://github.com/facebookresearch/maskrcnn-benchmark

1333
来自专栏ATYUN订阅号

【学术】将吴恩达的第一个深度神经网络应用于泰坦尼克生存数据集

这篇文章包括了神经网络在kaggle泰坦尼克生存数据集上的应用程序。它帮助读者加深他们对神经网络的理解,而不是简单地执行吴恩达代码。泰坦尼克生存数据集就是可以随...

3676
来自专栏刘笑江的专栏

R 语言线性回归应用:拟合 iOS 录音波形图

1256
来自专栏量化投资与机器学习

深度学习Matlab工具箱代码详解概览

谢谢大家支持,可以让更多朋友和有兴趣志同道合的人关注这个公众号。让知识传播的更加富有活力,谢谢各位读者。 查看之前博文资料请点击右上角查看历史消息 最近研究了几...

5328
来自专栏量子位

GitHub上大热的Deep Photo终于有TensorFlow版了!

王小新 编译整理 量子位 出品 | 公众号 QbitAI Prisma这个应用,你可能很熟悉。这是一个能将不同的绘画风格,迁移到照片中,形成不同艺术风格的图片。...

3786
来自专栏ATYUN订阅号

不用P图软件,TensorFlow pix2pix也能帮你打造出六块腹肌!

可视化结果是十分强大的。然而,在健身领域,要想清楚地看到未来的锻炼结果往往是很困难的。我们是否可以利用深度学习让人们更接近他们的个人健康目标,从而帮助他们设想未...

2934
来自专栏ATYUN订阅号

Keras和PyTorch的视觉识别与迁移学习对比

在上一篇文章中,我们简述了Keras和PyTorch的区别,旨在帮助你选择更适合你需求的框架。现在,我们进行实战进行。我们将让Keras和PyTorch互相较量...

4914
来自专栏图形学与OpenGL

实验5 OpenGL模型视图变换

2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它(物体运动,让人看它的不同部分)。(模型变换)

1223
来自专栏数据小魔方

sparklines迷你图系列18——ScatterChart

今天跟大家分享sparklines迷你图系列17——ScatterChart。 ScatterChart是日常使用频率非常频繁的图表——条形图。 在迷你图插件的...

2544
来自专栏phodal

【工具推荐】图像界的魔术师 ImageMagick

如果说 Pandoc 里文档界的瑞士军刀,那么 ImageMagick 就是图形界的瑞士军刀。 上周在为 Growth 制作插图的时候,需要:1. 合并不同的图...

2796

扫码关注云+社区