YUV到RGB的转换

以下内容来源于网络,下面三个链接里的内容是比较好的,感谢博主的分享。

http://blog.csdn.net/housisong/article/details/1859084

http://blog.csdn.net/tommy_wxie/article/details/37909643

http://www.cnblogs.com/qinjunni/archive/2012/04/06/2434393.html   这里有介绍YUV转RGB的优化 位运算和查表法

YUV到RGB的转换公式:网上收集到的各种公式

RGB颜色空间到YUV颜色空间的转换公式:

Y= 0.256788*R + 0.504129*G + 0.097906*B +  16;
    U=-0.148223*R - 0.290993*G + 0.439216*B + 128;
    V= 0.439216*R - 0.367788*G - 0.071427*B + 128;

(以下装换关系来自网络,本质都是一样的)

YUV颜色空间到RGB颜色空间的转换公式:  (给的示例中用的是这个

B= 1.164383 * (Y - 16) + 2.017232*(U - 128);
    G= 1.164383 * (Y - 16) - 0.391762*(U - 128) - 0.812968*(V - 128);
    R= 1.164383 * (Y - 16) + 1.596027*(V - 128);

另一种转换关系:

  1. // 转换公式(浮点方式)
  2. R = Y + 1.4075*(V-128)
  3. G = Y - 0.3455*(U-128) - 0.7169*(V-128)
  4. B = Y + 1.779*(U-128)

( 补充: 在视频格式中基本上都用的上面的转换公式;但在其他一些地方可能会使用下面的转换公式(不同的使用场合可能有不同的转换系数):

Y =  0.299*R + 0.587*G + 0.114*B;
    U = -0.147*R - 0.289*G + 0.436*B;
    V =  0.615*R - 0.515*G - 0.100*B;

R = Y + 1.14*V;
    G = Y - 0.39*U - 0.58*V;
    B = Y + 2.03*U;
  )

RGB to YUV Conversion

Y  =   (0.257 * R) + (0.504 * G) + (0.098 * B) + 16

Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128

Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128

YUV to RGB Conversion

B = 1.164(Y - 16) + 2.018(U - 128)

G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)

R = 1.164(Y - 16) + 1.596(V - 128)

无论是YUV444、YUV422、还是YUV420格式,根据对应的方法提取完YUV并转换为RGB数据后,其文件大小应该是: 图像的高 * 图像的宽 * 3 。由于不同的YUV码流转换为RGB数据的提取方式均不相同

我们知道YUYV视频格式的内存数据布局图示:

   图中可以看出Y的数据量是U或者V的两倍,这是因为人的眼睛一般对亮度比对颜色更敏感一些,所以将连续的两个像素的U(或V)值只保存一个U(或V)值,那么每个
像素平均占用16bit储存空间。

项目中使用到的YUV转RGB格式代码:

static void YUV2RGB(unsigned char Y, unsigned char U, unsigned char V,
                     unsigned char *R, unsigned char *G, unsigned char *B)
{
    *R = Y + (V - 128) + ((V - 128) * 103 >> 8);
    *G = Y - ((U - 128) * 88 >> 8) - ((V - 128) * 183 >> 8);
    *B = Y + (U - 128) + ((U - 128) * 198 >> 8);
    if (*R > 255)
        *R = 255;
    if (*G > 255)
        *G = 255;
    if (*B > 255)
        *B= 255;
    if (*R < 0)
        *R = 0;
    if (*G < 0)
        *G = 0;
    if (*B < 0)
        *B = 0;
}

void image_data_handle(unsigned char *dist, unsigned int size)
{//fb_buffer,将数据写入这个内存就相当于在屏幕输出,
    //这里就是framebuffer和v4l2的连接处
    unsigned long *to = (unsigned long *)fb_buffer;
    unsigned long *from = (unsigned long *)dist; //这个内存就是存储数据的,可以在这里对数据操作

    unsigned char Y0;
    unsigned char U0;
    unsigned char Y1;
    unsigned char V0;

    unsigned char R0;
    unsigned char G0;
    unsigned char B0;
    unsigned char R1;
    unsigned char G1;
    unsigned char B1;
    //  为何要除以4????
    size >>= 2;
    while(size--)
    {    //取出YUYV的值 这里是4:2:2的每个像素16位
        Y0 = (*from & 0x000000FF) >> 0;
        //U0 = 128;							//white and black
        U0=(*from & 0x0000FF00)>>8;	//colorful
        Y1 = (*from & 0x00FF0000) >> 16;
        //V0 = 128;							//white and blcak
        V0=(*from & 0xFF000000)>>24;	//colorful
        YUV2RGB(Y0, U0, V0, &R0, &G0, &B0);
        YUV2RGB(Y1, U0, V0, &R1, &G1, &B1);
        //rgb565  16位
        *to = (R0 & 0x1F) << 11 | (G0 & 0x3F) << 5 | (B0 & 0x1F) << 0;
        *to |= ((R1 & 0x1F) << 11 | (G1 & 0x3F) << 5 | (B1 & 0x1F) << 0) << 16;

        from++;
        to++;
    }
}

  

时间: 2024-10-07 13:34:55

YUV到RGB的转换的相关文章

【视频处理】YUV与RGB格式转换

YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(256 级别) 可以从8位 RGB 直接计算: Y = 0.299 R + 0.587 G + 0.114 B U = - 0.1687 R - 0.3313 G + 0.5 B + 128 V = 0.5 R - 0.4187 G - 0.0813 B + 128 反过来,RGB 也可以直接从YUV

YUV与RGB格式转换

YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(256 级别) 可以从8位 RGB 直接计算: Y = 0.299 R + 0.587 G + 0.114 B U = - 0.1687 R - 0.3313 G + 0.5 B + 128 V = 0.5 R - 0.4187 G - 0.0813 B + 128 反过来,RGB 也可以直接从YUV

YUV 和RGB之间转换函数

void myRgb2YUV(int width, int height,  unsigned char *yuv, unsigned char *rgb) { for(int i=0;i<width;++i) { for(int j=0;j<height;++j) { int B=rgb[j*width*3+i*3]; int G=rgb[j*width*3+i*3+1]; int R=rgb[j*width*3+i*3+2]; int Y=int(16.5+(0.2578*R+0.504*

图像色彩空间YUV和RGB的差别

http://blog.csdn.net/scg881008/article/details/7168637 假如是200万像素的sensor,是不是RGB一个pixel是2M,YUV是1M? 首先,200万象素的sensor,就是有2M个pixel;     YUV是电视传输用的名词,一个亮度信号(Y),两个色差信号(U分量.V分量)     YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法(属于PAL).YUV主要用于优化彩色视频信号的传输,使其向后兼容老式黑 白电视.与RG

YUV RGB 格式转换

第一个公式是RGB转YUV(范围0-255)时用的,第二个公式是用在YUV转换RGB(范围0-255)时用的.1. Y = 0.257 * R + 0.504 * G + 0.098 * B + 16; U = -0.148 * R - 0.291 * G + 0.439 * B + 128; V = 0.439 * R - 0.368 * G - 0.071 * B + 128; 黑色:Y=16 ,U= V =128 红色:Y=82 ,U=90,V=240 绿色:Y=145,U=54,V=34

YUY2(YUV) 与 RGB 格式图片的相互转换 以及 基于YUY2(YUV)的blending

这是一个项目里使用的,API里从pool里取出的格式都是YUY2,但是图像处理的API库中要求都是jepg格式. YUY2经常用于电视制式以及许多摄像头的输出格式.而我们在处理时经常需要将其转化为RGB进行处理,这里简单介绍下YUY2(YUV)与RGB之间相互转化的关系: http://msdn2.microsoft.com/en-us/library/ms893078.aspx YUY2(YUV) To RGB: C = Y - 16 D = U - 128 E = V - 128 R = c

YUV422与RGB互相转换

  YUV422与RGB互相转换(经验证在IPNC与PC上都可以) 前一段时间在DM8168中进行颜色空间的转换,在网上找了些程序,自己也根据网上的改了下,由于能力问题,实在是不好意思说做了好几天才弄出来, 主要是因为YUV<—>RGB有各种各样的转换公式.在多次的实验修改后,终于找到了对的公式,共享出来,以便需要的人选择. 在监控系统中大多采用YUV的颜色空间,原因不说了,网上搜YUV转RGB各种介绍. 在TI的视频英语达芬奇系列中(这里只测试了DVR.IPNC), 采用如下公式: yCbC

RGB图像数据字符叠加,图像压缩(ijl库),YUV转RGB

jackyhwei 发布于 2010-01-01 12:02 点击:3218次  来自:CSDN.NET 一些非常有用的图像格式转换及使用的源代码,包括RGB图像数据字符叠加,图像压缩(ijl库),YUV转RGB等等. TAG: YUV  YUV转RGB  RGB  BMP转JPG  文字叠加   /**************************************File: yuvrgb24.hDescription: header file for yuvrgb24.cDate:

YUV422与RGB互相转换(经验证在IPNC与PC上都可以)

 前一段时间在DM8168中进行颜色空间的转换,在网上找了些程序,自己也根据网上的改了下,由于能力问题,实在是不好意思说做了好几天才弄出来,主要是因为YUV<->RGB有各种各样的转换公式.在多次的实验修改后,终于找到了对的公式,共享出来,以便需要的人选择. 在监控系统中大多采用YUV的颜色空间,原因不说了,网上搜YUV转RGB各种介绍. 在TI的视频英语达芬奇系列中(这里只测试了DVR.IPNC), 采用如下公式: yCbCr<-->rgb Y' = 0.257*R' + 0