(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程文件请关注知识星球:成工fpga,https://t.zsxq.com/DMeqH,关注即送200GB学习资料,链接已置顶!)
直方图的均衡化上个系列也有详细的讲解,本课主要完成图像直方图均衡化的FPGA实现。
我们先来分析一下,实现图像直方图的均衡需要处理几帧图片?第一帧图片完成直方图统计,在第一帧和第二帧图像之间完成直方图数据的读取,同时完成直方图数据的均衡化和均衡化的存储。第二帧图像就可以根据存储的均衡化数据完成整幅图像的均衡化,所以要完成图像的均衡化,需要两帧图像,视频流水起来,就是后一帧图像根据前一帧图像完成图像的直方图均衡化。
那我们再来分析一下,如果要对均衡化的图像再进行直方图统计,需要处理几帧图像?上面我们分析第二幅图像完成图像的均衡化,在第二幅图像均衡化的过程中,可以对均衡化的图像数据进行直方图的统计,那就是在第二幅图像结束的时候完成图像均衡化的直方图统计,如果想把直方图叠加到均衡化后的图片上,那就要在第三帧图像上完成。
在\src\hist文件夹下新建hist_equalization.sv文件,用来实现图像的直方图数据的均衡化,均衡化就是将小于等于当前标号的直方图数据求和,其实第一个均衡化的数据就是第一个直方图的数据,第二个均衡化的数据就是第一个和第二个直方图数据的和,第三个均衡化的数据就是前三个直方图数据的和......最后一个均衡化的数据所有直方图数据的和。如下,52-58行求和的运算。
每次求和完成一个直方图均衡化数据的计算,然后直接对均衡化后的数据进行归一化处理,归一化处理是将数据映射到0-255区间。归一化因子是699,计算公式是256*1024*1024/(H_ACTIVE*V_ACTIVE),数据放大了2^20倍,所以最终的结果将低20位直接舍弃,也就是结果右移20位。归一化后的均衡化数据存放到数组中,下一帧数据的每个像素值作为数组的地址读出其中的值,完成下一帧图像的均衡化,这个超过其实和gamma矫正完全一样。
在top文件中例化了rgb2ycbcr,hist_statistics,hist_equalization,ycbcr2rgb,hist_norm,hist_mem,plot_hist等模块,如下所示。先将RGB图像转成灰度图像,对灰度图像进行图像的直方图统计和均衡,再将均衡后的灰度图像转换回RGB图像,同是对均衡后的灰度图像进行直方图统计。
在tb_image_sim文件中的第二个initial块中,将图像测试平台和FPGA硬件仿真的结果保存并比对,需要注意一点,要完成两帧图像的处理,通过wait((frame_cnt == FRAME_NUM) & frame_done)来实现,这儿FRAME_NUM是2。
双击sim文件夹下的top_tb.bat文件,完成系统的自动化仿真。
可以看到在modelsim的Transcript有如下的打印信息,图像测试平台和FPGA硬件仿真的结果一致。
打开img文件夹,也可以看到图像测试平台和FPGA硬件仿真的结果是一致的(no_seq*是图像测试平台处理后的图片,seq*是FPGA硬件仿真处理后的结果)。
同时也可以看一下图像释放图均衡前后的效果图。