前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RGB转YCbCr算法 之Matlab & FPGA实现介绍

RGB转YCbCr算法 之Matlab & FPGA实现介绍

作者头像
ExASIC
发布2021-09-17 12:10:37
2K0
发布2021-09-17 12:10:37
举报
文章被收录于专栏:ExASICExASIC

1.引言

虽然现在RGB是计算机视觉最基本的三原色组成结构,但是YCbCr也有非常重要的角色,甚至却之不可,理由如下:

1)很多机器视觉,图像处理/检测识别算法,不关注色彩,只需要在灰度域处理即可;

2)包括HDMI接口,UVC协议,BT656/709/1120等,都有采用YCbCr格式进行传输,保证了相互转换的一致性,同时采用YCbCr422/420有效降低了传输带宽;

3)不管实H.264还是AVS,JPEG,MJPEG等都采用YUV格式进行编码压缩;

4)and so on...

RGB转YCbCr虽然很基础,但是很重要(YCbCr转RGB雷同),怎样做更快也是一门学位。在本书开篇“图像处理硬件加速引擎”中,笔者引用conquer的《让你的软件飞起来》,从最初的计算机浮点运算120S,通过定点化、查找表等方式加速到了0.5S,提升了240倍,接着毕设介绍了硬件并行加速的思维,再次将计算时间缩短到了1ms左右,有一次提升了500倍,前后将近10万倍的加速,足以见得,硬件加速的重要性与意义。那么,废话少说,我们从新再梳理一遍。


2.YCbCr原理介绍:

YCbCr 则是在世界数字组织视频标准研制过程中作为ITU - R BT.601 建议的一部分,其实是YUV经过缩放和偏移的翻版。YCbCr其由Y(Luminance)、Cb(Chrominance-Blue)和Cr(Chrominance-Red)组成,其中Y表示颜色的明亮度和浓度,而Cb和Cr则分别表示颜色的蓝色浓度偏移量和红色浓度偏移量。

医学研究证明,人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到的图像质量的变化。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。我们通常把YUV和YCbCr概念混在一起,但其实这两者还是有挺大的区别。

首先,YUV是一种模拟信号,其色彩模型源于RGB模型,即亮度与色度分离,适合图像算法的处理,常应用于在模拟广播电视中,其中Y∈ [0,1] U,V∈[-0.5,0.5] 。

而YCbCr是一种数字信号,其色彩模型源于YUV模型,它其实YUV压缩和偏移的版本(所谓偏移就是从[-0.5,0.5] 偏移到[0,1 ],因此计算时候会加128),在数字视频领域应用广泛,是计算机中应用最多的格式,包括JPEG,MPEG,H.264/5, AVS等都采用YCbCr格式,我们通常广义的讲的YUV,严格的讲应该就是YCbCr。

YCbCr继续细分,有2种格式:tv range与full range,主要区别如下:

1)tv range:Y∈[16,235] Cb∈[16-240] Cr∈[16-240] ,主要是广播电视采用的数字标准;

2)full range:Y、Cb、Cr∈[0-255] ,主要是PC端采用的标准,所以也称pc range

关于为何tv range要量化到16-235,主要是由于YUV最终在模拟域传输,因此为了防止数模转换时引起过冲现象,于是将数字域限定在16-235。至于为什么选择16/235,可自行了解Gibbs Phenomenon吉布斯现象,这里不再继续展开。

所以RGB转YCbCr,得明确转tv range还是pc range;反之也可以通过像素值范围,去判断是tv range,还是pc range,甚至还得明确是什么格式范围,否则会导致偏色。如下图所示,为BT.601标准中YUV的的UV坐标模型(U越大越蓝,V越大越红):

1)针对标准SDTV(标准分辨率电视),采用ITU-R BT.601数据格式,其中YCbCr的为tv range,所以YCbCr也有一定的区间范围,因此给出RGB与YCbCr的相互转换公式如下:

2)针对标准HDTV(高清晰度电视),采用ITU-R BT.709数据格式,其参数略有不同,这里给出RGB与YCbCr的相互转换公式如下:

3)最后,针对full range或者pc range的的YCbCr格式,这里YCbCr均为0-255的取值,其RGB与YCbCr的转换公式,如下:

因此在具体转换前,务必搞清楚当前的制式,否则很容易引起偏色甚至异常现象产生。另外,图像传感器可以配置输出RGB/YCbCr,因此相对应的手册一般也会给出转换公式,如下所示,为OV7725传感器手册中,RGB与YCbCr的转换关系。与上面full range下的RGB转YCbCr公式,还是有一些略微的区别。

3.RGB转YCbCr硬件思维推导

约定,我们采用上一节中full range的YCbCr转RGB的公式进行推导。

由于Y或者CbCr的计算类似,这里仅以Y为例进行推演,最原始的公式如下:

Y0 = R*0.299 + G*0.587 + B*0.114

首当其冲的是干掉浮点,那么进行256倍扩大后,如下(防止溢出,得取不大于本身的最大整数,即直接*256后直接舍去小数)

Y1 = R*76 + G*150 + B*29

由于扩大了256倍即2的8次方,那么对上述结果再右移8bit,得到最后的结果,如下(其中76+150+29=255<1024,不会溢出):

Y2 = (R*76 + G*150 + B*29)>>8

其实在PC中,采用查找表理论上会比乘法器更快,但由于FPGA中,本身就有乘法器资源,因此可以直接快速计算;但如果用查找表,则需要768*18bit的RAM缓存,反而代价更大,因此综合评估,乘法器最优。


同上,推导Cb/Cr的计算公式,如下:

Cb = (-R*43 - G*84 + B*128 + 32678)>>8

Cr = (R*128 - G*107 - B*20 + 32678)>>8

4.RGB转YCbCr Matlab实现

首先,我们基于Matlab进行仿真,这里先给出相关代码,如下(申明,本书中所有图像处理代码都不采用Matlab Image库,纯手工打造加速,便于读者的理解)

代码语言:javascript
复制


如上Matlab代码中,整体流程如下:

1)读取本地RGB格式的jpg图像;

2)创建Y通道与Cb/Cr通道图像数组;

3)分别计算YCbCr的数据;

4)uint8保存后,显示结果并保存于当前文件夹

这里Cb与Cr构建了3维数组,主要是为了借用RGB通道,显示B与R的偏移量。否则仅显示灰度的Cb Cr,没有直观的效果。

5.RGB转YCbCr FPGA实现

按照我在第*章中约定的方式,我们采用兼容通用并行视频流格式时序,如下图所示,本书所有图像算法的设计都将基于此时序,方便算法之间的Pipeline和移植。

由于RGB转YCbCr着实简单,那么我们直接上代码介绍,如下:

代码语言:javascript
复制



整体流程和Mtlab处理类似,只不过FPGA每个时钟处理一步运算,并行计算合计,花3个时钟计算得到结果,详解如下:

1)利用9个8bit乘法器,分别计算定点化后9个乘法,即Step 1

2)分别扩大256倍后的Y, Cb,Cr,即Step 2

3)缩小256倍,可以右移8bit,或者直接取高8bit,更省资源

4)由于耗费了3个clk,同步将vsync及href信号delay 3个clock,保持时序对齐。

上述设计由于太过于简单,都没有仿真的必要,直接上硬件。但为了将讲整个仿真平台搭建起来,后续我们提供一套基于modelsim的图像算法处理仿真环境。当前由于时间的限制,后续再补上相关内容,敬请期待。

本篇关于RGB转YCbCr的,基于Matlab与FPGA的实现思维,就讲解到此,如有问题请直言不讳,我也将知无不言,谢谢。


参考文献:

https://www.cnblogs.com/ninghechuan/p/9515639.html

https://www.cnblogs.com/luoyinjie/p/7219319.html

https://blog.csdn.net/qq_36955294/article/details/83443317

https://blog.csdn.net/cukexr2833/article/details/107841687


I am CrazyBingo!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ExASIC 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.YCbCr原理介绍:
  • 3.RGB转YCbCr硬件思维推导
  • 4.RGB转YCbCr Matlab实现
  • 5.RGB转YCbCr FPGA实现
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档