今天我们开始一段新的旅程:FPGA图像处理。
作者:Trustintruth
来源: https://zhuanlan.zhihu.com/p/100572566
首先对于接触FPGA时间不长的同学们,一听到图像算法就会害怕,总是觉得算法是一种非常繁琐复杂的东西,还没开始做就被吓破胆。其实都是数学罢了。
今天我们来接触最简单的两个,中值滤波。首先何谓滤波?图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。
图像滤波的目的有两个:一是抽出对象的特征作为图像识别的特征模式;另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。
而对滤波处理的要求也有两条:一是不能损坏图像的轮廓及边缘等重要信息;二是使图像清晰视觉效果好。
而我们今天面对的主要为椒盐噪声,椒盐噪声是数字图像的一个常见噪声,就是在图像上随机出现黑色白色的像素。椒盐噪声是一种因为信号脉冲强度引起的噪声。
首先要明白,RGB图像上,每一个像素点都是三段数字,分别对应R,G,B三种颜色(参考文章FPGA初始——VGA)
在灰白图像中,椒盐噪声若果是黑点的话,就是指这一点的像素值明显低于周围像素点的值,而白点就是明显高于周围的像素值。而对于这种噪声,只要让他与周围的值相持平皆可以消除。中值滤波和均值滤波就是根据这种方法来消除,每个像素点周围都有8个像素,如果使用周围8个像素的平均值来代替这个像素点的像素值,就是均值滤波的基本方法;如果使用8个像素点的中值来代替这个像素点的像素值,就是中值滤波的基本方法。
要做这个处理,核心就是要搭建3x3矩阵。如何搭建3x3矩阵呢?我们有三种方法:
- 通过2个或者3个RAM的存储来实现3X3像素窗口;
- 通过2个或者3个FIFO的存储来实现3X3像素窗口;
- 通过2行或者3行Shift\_RAM的存储来实现3X3像素窗口;
以shift\_ram为例,shift\_ram就是移位寄存器,如图:
(原谅我VISO问题大直接删了,画图画的辣鸡图)左方数据输入,N是每行的像素点数,每行输出的就是要的矩阵。
(各位老爷别在意这个图,上次也有代码乱码的问题,这次的图春节一定改……)这样我们就得到了3x3矩阵。最后均值滤波就是求平均值,就是周围8个的和除个8,除法都不用做,直接右移三位来实现除8.
代码实现就不再贴了,网上有很多,而且也是IP核的调取,基础操作。
获取更多代码与资料,欢迎关注我啊!
推荐阅读
关注此系列,请关注专栏FPGA的逻辑