RGB转YCbCr算法 之Matlab & FPGA实现介绍 您所在的位置:网站首页 cb与cbr的区别 RGB转YCbCr算法 之Matlab & FPGA实现介绍

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

2023-09-02 21:56| 来源: 网络整理| 查看: 265

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库,纯手工打造加速,便于读者的理解)

% ----------------------------------------------------------------------- % \\\|/// % \\ - - // % ( @ @ ) % +---------------------------oOOo-(_)-oOOo-----------------------------+ % CONFIDENTIAL IN CONFIDENCE % This confidential and proprietary software may be only used as authorized % by a licensing agreement from CrazyBingo (Thereturnofbingo). % In the event of publication, the following notice is applicable: % Copyright (C) 2013-20xx CrazyBingo Corporation % The entire notice above must be reproduced on all authorized copies. % Author : CrazyBingo % Technology blogs : www.crazyfpga.com % Email Address : [email protected] % Filename : RGB2YCbCr_Convert.m % Date : 2013-04-21 % Description : Convert RGB image to YCbCr format with mac % Modification History : % Date By Version Change Description % ========================================================================= % 13/04/21 CrazyBingo 1.0 Original % ------------------------------------------------------------------------- % | Oooo | % +-----------------------------oooO--( )-------------------------------+ % ( ) ) / % \ ( (_/ % \_) % ----------------------------------------------------------------------- clear all; %清除Matlab缓存数据 % ------------------------------------------------------------------------- % Read PC image to Matlab IMG1 = imread('../images/Scart.jpg'); % 读取jpg图像 h = size(IMG1,1); % 读取图像高度 w = size(IMG1,2); % 读取图像宽度 % ------------------------------------------------------------------------- subplot(2,2,1); imshow(IMG1);title('RGB Image'); % ------------------------------------------------------------------------- % Relized method 2:myself Algorithm realized % Y = ( R*76 + G*150 + B*29) >>8 % Cb = (-R*43 - G*84 + B*128) >>8 % Cr = ( R*64 - G*107 - B*20) >>8 IMG1 = double(IMG1); IMG_Y = zeros(h,w); IMG_Cb = zeros(h,w,3); IMG_Cr = zeros(h,w,3); for i = 1 : h for j = 1 : w IMG_Y(i,j) = bitshift(( IMG1(i,j,1)*76 + IMG1(i,j,2)*150 + IMG1(i,j,3)*29),-8); IMG_Cb(i,j,3) = bitshift((-IMG1(i,j,1)*43 - IMG1(i,j,2)*84 + IMG1(i,j,3)*128 + 32678),-8); IMG_Cr(i,j,1) = bitshift(( IMG1(i,j,1)*128 - IMG1(i,j,2)*107 - IMG1(i,j,3)*20 + 32678),-8); end end % ------------------------------------------------------------------------- IMG_Y = uint8(IMG_Y); IMG_Cb = uint8(IMG_Cb); IMG_Cr = uint8(IMG_Cr); subplot(2,2,2); imshow(IMG_Y); title('Y Channel'); subplot(2,2,3); imshow(IMG_Cb); title('U Channel'); subplot(2,2,4); imshow(IMG_Cr); title('V Channel'); imwrite(IMG_Y,'.\local_Y.jpg'); imwrite(IMG_Cb,'.\local_U.jpg'); imwrite(IMG_Cr,'.\local_V.jpg');

如上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着实简单,那么我们直接上代码介绍,如下:

/*----------------------------------------------------------------------- \\\|/// \\ - - // ( @ @ ) +-----------------------------oOOo-(_)-oOOo-----------------------------+ CONFIDENTIAL IN CONFIDENCE This confidential and proprietary software may be only used as authorized by a licensing agreement from CrazyBingo (Thereturnofbingo). In the event of publication, the following notice is applicable: Copyright (C) 2011-20xx CrazyBingo Corporation The entire notice above must be reproduced on all authorized copies. Author : CrazyBingo Technology blogs : www.crazyfpga.com Email Address : [email protected] Filename : RGB2YCbCr_Convert.v Date : 2013-05-26 Description : Convert the RGB888 format to YCbCr444 format. Modification History : Date By Version Change Description ========================================================================= 13/05/26 CrazyBingo 1.0 Original 14/03/16 CrazyBingo 2.0 Modification ------------------------------------------------------------------------- | Oooo | +-------------------------------oooO--( )-----------------------------+ ( ) ) / \ ( (_/ \_) -----------------------------------------------------------------------*/ `timescale 1ns/1ns module VIP_RGB888_YCbCr444 ( //global clock input clk, //cmos video pixel clock input rst_n, //global reset //Image data prepred to be processd input per_img_vsync, //Prepared Image data vsync valid signal input per_img_href, //Prepared Image data href vaild signal input [7:0] per_img_red, //Prepared Image red data to be processed input [7:0] per_img_green, //Prepared Image green data to be processed input [7:0] per_img_blue, //Prepared Image blue data to be processed //Image data has been processd output per_img_vsync, //Processed Image data vsync valid signal output per_img_href, //Processed Image data href vaild signal output [7:0] post_img_Y, //Processed Image brightness output output [7:0] post_img_Cb, //Processed Image blue shading output output [7:0] post_img_Cr //Processed Image red shading output ); //-------------------------------------------- /********************************************* //Refer to page 5 Y = R*0.299 + G*0.587 + B*0.114 Cb = -R*0.169 - G*0.331 + B*0.5 + 128 Cr = R*0.5 - G*0.419 - B*0.081 + 128 ---> Y = (76 *R + 150*G + 29 *B)>>8 Cb = (-43*R - 84 *G + 128*B + 32768)>>8 Cr = (128*R - 107*G - 20 *B + 32768)>>8 **********************************************/ //Step 1 reg [15:0] img_red_r0, img_red_r1, img_red_r2; reg [15:0] img_green_r0, img_green_r1, img_green_r2; reg [15:0] img_blue_r0, img_blue_r1, img_blue_r2; always@(posedge clk or negedge rst_n) begin if(!rst_n) begin img_red_r0


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有