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

发布于:2025-06-30 ⋅ 阅读:(18) ⋅ 点赞:(0)

(本系列只需要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的硬件编程中,时刻都要关注数据是否会规定的范围,这也是软件编程和硬件编程的一个重大的区别。


网站公告

今日签到

点亮在社区的每一天
去签到