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

闲庭信步使用SV搭建图像测试平台:第十九课——YCbCr图像转RGB图像

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

上篇我们讲解了RGB图像如何转YCbCr格式的图像,图像图YCbCr格式下完成了处理,最终可能还是要转回RGB图像的格式。

这个其实很简单,也有现成的公式,比如下面这个公式。

我们在我们在img_process_pkt包的image_process类中新建一个ycbcr2rgb的task,直接把公式实现一下。

仿真文件tb_image_sim如下,先将RGB图像数据转换成YCbCr格式,然后再将YCbCr格式的图片转换回RGB的格式,然后分别保存RGB每个通道的图片和RGB的图片。

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

打开image文件夹,发现生成的图像并不是我们期望的图片。

再看看单通道的图片,也都不太正常的样子。

出现了问题就要分析,回头再看看公式,如下所示,以R为例,如果两项之和大于255或者小于0,超出了图像8位无符号位的范围,而我们在task中没有考虑超出范围的情况,可能会造成结果溢出,造成图像不正常。还有一点,就是数据格式的隐形转换,虽然y,cb,cr和R,G,B等数据都是8位无符号数据,但是由于系数有小数,系统很明显会转换成有符号实数进行计算。

我们可以先把范围限定一下,如下所示:

再看看生成的图像,除了红色通过有些改进,其它通道变得更加糟糕了,RGB图像也是一样。

这说明了什么呢?说明并不只是最后结果有问题,而是中间的计算也存在的问题。为了方便,我们是直接使用的小数进行实数的运算,而在可综合FPGA的RTL代码中,根本不可能这样运算的。这样运算的后果就是如果某一步结果超出了范围,就会照成最终结果的不可控。可以这样理解,还是以R的求解为例,如果相加的两项有一项都超出了0-255的范围,那这项的值其实就已经不对了,更不要说两项都超出范围,甚至G的三项都超出范围,这就是我们常说的一步错,步步错。

那问题应该如何解决呢?要按照可综合FPGA的RTL代码的思维进行设计,先对公式合并化简到如下的形式。

中间的结果用无符号数进行保存,并对位数进行适当的扩展,然后所有正项分别相加,所有负向也分别相加,最后根据正负项的大小进行相应的加减和范围的判断,总而言之,就是每一步的运算都是可控的。如下所示。

我们再看看转换后生成的图片,都正常了。

本篇的内容,看似简单,但是非常的重要,因为涉及到了软件编程中数据范围的控制,当然在FPGA的硬件编程中,时刻都要关注数据是否会规定的范围,这也是软件编程和硬件编程的一个重大的区别。

相关文章:

  • 多模态大语言模型arxiv论文略读(143)
  • python基础23(2025.6.29)分布式爬虫(增量式爬虫去重)redis应用_(未完成!)
  • Vue列表渲染与数据监测原理
  • win上对调ctrl和alt键
  • Gemini cli Quickstart
  • Conda 环境配置之 -- Mamba安装(causal-conv1d、mamba_ssm 最简单配置方法)-- 不需要重新配置CDUA
  • 【FreeRTOS-任务通知】
  • 【Linux高级全栈开发】2.4 自研框架:基于 dpdk 的用户态协议栈的实现
  • 数据结构 哈希表、栈的应用与链式队列 6.29 (尾)
  • 模拟工作队列 - 华为OD机试真题(JavaScript卷)
  • Python 数据分析与可视化 Day 11 - 特征工程基础
  • 从0开始学linux韦东山教程Linux驱动入门实验班(3)
  • python中多线程:线程插队方法join详解、线程停止、通过变量来让线程停止
  • Java面试宝典:基础五
  • 【数据集】中国2016-2022年 城市土地利用数据集 CULU
  • 操作系统学习笔记 | 操作系统常见问题整理
  • AlphaFold3安装报错
  • NumPy 统计函数与矩阵运算指南
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月29日第123弹
  • 理解 Confluent Schema Registry:Kafka 生态中的结构化数据守护者