当前位置: 首页 > backend >正文

闲庭信步使用图像验证平台加速FPGA的开发:第二十二课——图像直方图统计的FPGA实现

 (本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程文件请关注知识星球:成工fpga,https://t.zsxq.com/DMeqH,关注即送200GB学习资料,链接已置顶!)

图像的直方图统计在上个系列有详细的讲解,本课主要完成直方图统计的FPGA实现。

图像的直方图统计就是对一副图像中0-255这256个像素点出现的次数,在FPGA中,就要用RAM将各个像素点出现的次数存储起来,每来一个新的像素点,就以这个像素点的值为地址从RAM从取出对应的值,加一后再写回到这个地址中去。

按照上面的分析,使用RAM进行直方图统计还有有些麻烦的,因为读RAM需要一个时钟周期,写RAM也需要一个时钟周期,而像素点数据是一个时钟来一个,这就要求每个时钟都要同时读写RAM,虽然读写的地址不同。其实Xilinx的双口RAM是不支持同时读写的,因为wea就是读写使能信号,要不是读,要不是写,不能同时读写。

其实这个问题很好解决,有时候用简单的方式更容易实现,这儿我们可以使用数组来存储,对于数组的操作,一个时钟周期就可以完成读写操作

还有一个问题,在视频处理中,图像是一帧帧流水处理的,我们要统计每幅图像的直方图,完成一幅图像的直方图统计后就要把直方图的数据传输出去并把数组的内容清零,为下一副图像的直方图统计做准备。而通过场同步信号可以判断一幅图像是否处理完成,来对存储直方图的数组读走和清空操作

在\src\hist文件夹下新建hist_statistics.sv文件,使用数组hist_ram来存储图像的直方图统计的信息。

有了数组,图像直方图统计的功能实现非常的简单,直接以输入的数据为索引读写数组即可;而且在直方图的数据被读取完毕后直接清空即可。

根据场同步信号,新建rd_result_domain信号,在该信号有效时间内根据wr_cnt将数组中的数据全部读走。

最后图像直方图的数据dout通过dout_en的标示输出出去,同时生成dout_done信号,用来表示直方图的数据被读完成。

到这儿还有一个问题,那就是可能有些像素点统计的值非常大,而有些像素点统计的值又非常的小,就是直方图的数据很难直观的反应出图像的信息,这时候我们就对图像进行归一化都一定的范围,以便直观的观察。

在\src\hist文件夹下新建hist_norm.sv文件,用来将直方图的数据归一化到0——NORM之间,这个避免除法的操作,直接将直方图数据和FACTOR相乘即可。由于数据扩大了1024*1240倍,最终的结果应该直接舍弃低20位,但是这样的话直方图的数据整体水平都会很小(因图像而异),所以这儿只是舍弃了低13位,让直方图的数据基本在0-255区间内。

top文件例化了rgb2ycbcr,hist_statistics和hist_norm这三个模块。

在img_process_pkt包中也新建hist_fpgatask,方便图像测试平台和FPGA仿真数据的比对。

在tb_image_sim文件中的第二个initial块中,将图像测试平台和FPGA硬件仿真的结果保存并比对。

双击sim文件夹下的top_tb.bat文件,完成系统的自动化仿真。

可以看到在modelsim的Transcript有如下的打印信息,图像测试平台和FPGA硬件仿真的结果一致。

打开img文件夹,也可以看到图像测试平台和FPGA硬件仿真的结果是一致的(no_seq*是图像测试平台处理后的图片,seq*是FPGA硬件仿真处理后的结果)。

http://www.xdnf.cn/news/15666.html

相关文章:

  • 【C++】总结—哪些场景下会产生临时变量或者临时对象?
  • k8s:手动创建PV,解决postgis数据库本地永久存储
  • React条件渲染
  • 零信任产品联合宁盾泛终端网络准入,打造随需而变、精准贴合业务的网络安全访问体系
  • Docker 与 GPU 训练
  • OSPF路由协议的协商过程
  • Java全栈面试实录:从电商场景到AIGC的深度技术考察
  • 基于现代R语言【Tidyverse、Tidymodel】的机器学习方法与案例分析
  • Maven私服仓库,发布jar到私服仓库,依赖的版本号如何设置,规范是什么
  • 精通 triton 使用 MLIR 的源码逻辑 - 第002节:再掌握一些 triton 语法 — 通过 02 softmax
  • 生成式引擎优化(GEO)核心解析:下一代搜索技术的演进与落地策略
  • Python包发布与分发全指南:从PyPI到企业私有仓库
  • LiteCloud超轻量级网盘项目基于Spring Boot
  • Solr7升级Solr8全攻略:从Core重命名到IK分词兼容,零业务中断实战指南
  • css样式中的选择器和盒子模型
  • 《汇编语言:基于X86处理器》第8章 高级过程(2)
  • QT跨平台应用程序开发框架(10)—— Qt窗口
  • PyCharm 高效入门指南(引言 + 核心模块详解)
  • C++拷贝构造
  • 【数据结构】栈和队列
  • 李宏毅《生成式人工智能导论》 | 第15讲-第18讲:生成的策略-影像有关的生成式AI
  • 【读论文】AgentOrchestra 解读:LLM 智能体学会「团队协作」去解决复杂任务
  • 河南萌新联赛2025第一场-河南工业大学
  • Python--plist文件的读取
  • 【Linux】LVS(Linux virual server)
  • python-字典、集合、序列切片、字符串操作(笔记)
  • 大型语言模型的白日梦循环
  • Git简介与特点:从Linux到分布式版本控制的革命
  • Python 网络爬虫 —— 代理服务器
  • github不能访问怎么办