闲庭信步使用图像验证平台加速FPGA的开发:第十七课——图像高斯滤波的FPGA实现
(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程文件请关注知识星球:成工fpga,https://t.zsxq.com/DMeqH,关注即送200GB学习资料,链接已置顶!)
上节课我们讲解了图像五行数据缓存模块data_cache5.sv的实现,有了data_cache5.sv文件,那5x5算子的各种算法就可以直接进行开发了。那本篇就来实现5x5算子的高斯滤波。
高斯滤波的核心作用是消除高斯噪声并实现信号平滑处理,同时保持较好的边缘细节,广泛应用于图像处理和电子信号处理领域,现在常用的高斯金字塔,就是先对图片进行高斯滤波,然后再抽取成分辨率小的图片。
我们先来找一组高斯算子,由于高斯算子都是小数,我们FPGA不能直接处理,那就想转变成整数。
在img_process_pkt中,我们先实现高斯滤波的功能,如下所示。
FPGA实现高斯滤波,可以直接乘加后将结果除以159即可,但是本着尽量少使用乘除法的原则,乘2可以左移一位;乘4左移2位;乘5(4+1)就是左移2位和原数值相加;乘9(8+1)左移3位和原数值相加;乘12(8+4)左移3位和左移2位相加;乘15(16-1)就是左移4位和原数值相减。而除159可以用2048/159约等于13(16-2-1),就是将所有高斯因子的和sum左移4位,减去sum左移1位,再减去sum,将最终的结果右移11位即可。
在\src\gaussian文件夹下新建gaussian.sv文件,编程实现就很简单了,例化data_cache5模块获取5x5的像素数据,将高斯因子中的数据安装乘2,乘4,乘5,乘9,乘12,乘15分组求和,然后完成乘2,乘4,乘5,乘9,乘12,乘15的计算。
用一个时钟实现上面6个数的相加,然后再用一个时钟实现除159的计算,用减法即可。由于计算用到了2个时钟周期,就需要把场同步,行同步,数据有效信号也延时2个时钟。
同理,我们在img_process_pkt中实现的gaussian task直接用的乘除法,和FPGA实现的结果一定存在偏差,所以要按照FPGA设计的思路来新写一个高斯滤波的task,如下所示。
在top文件中对rgb2ycbcr和gaussian模块的例化,完成对灰度图像的高斯滤波。
在tb_image_sim文件中的第二个initial块中,将图像测试平台和FPGA硬件仿真的结果保存并比对。
双击sim文件夹下的top_tb.bat文件,完成系统的自动化仿真。
可以看到在modelsim的Transcript有如下的打印信息,图像测试平台和FPGA硬件仿真的结果一致。
对比一下高斯滤波前后的图片,效果还是非常明显的。
而且也可以看到图像测试平台和FPGA硬件仿真的结果是一致的(no_seq*是图像测试平台处理后的图片,seq*是FPGA硬件仿真处理后的结果)。