TV颜色空间—YUV,YIQ,YCbCr

TV颜色空间—YUV,YIQ,YCbCrTV 颜色空间 YUV YIQ YCbCr1 TV 颜色空间 TV 颜色空间广泛应用于电视信号的记录 存储 传输 显示

大家好,欢迎来到IT知识分享网。

TV颜色空间—YUV,YIQ,YCbCr

1.前言

     自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用的过程,所以在不同的应用领域中为了更好更准确的满足各自的需求,就出现了各种各样的色彩空间模型来量化的描述颜色。我们比较常接触到的就包括 RGB / CMYK / YIQ / YUV / HSI等等。

    对于数字电子多媒体领域来说,我们经常接触到的色彩空间的概念,主要是RGB ,YUV这两种(实际上,这两种体系包含了许多种具体的颜色表达方式和模型,如sRGB, Adobe RGB,YUV422, YUV420 …), RGB是按三基色加光系统的原理来描述颜色,而YUV则是按照 亮度,色差的原理来描述颜色。“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

2.YUV颜色空间的由来

F = r [R] + g [G] + b [B]

3.YUV颜色空间

    YUV颜色空间是北美NTSC和欧洲PAL模拟电视系统颜色编码的基础。亮度分量Y通过下述公式计算出:

TV颜色空间—YUV,YIQ,YCbCr

   上述公式假定的是RGB值是根据TV编码标准进行Gamma校正之后逇值。UV分量是分别对亮度分量与红色分量、亮度分量与蓝色分量进行差值之后再赋予一定的权重:

TV颜色空间—YUV,YIQ,YCbCr

    因此,从RGB转换为YUV的关系为:

TV颜色空间—YUV,YIQ,YCbCr

  相应的,从YUV转换为RGB的关系为:

TV颜色空间—YUV,YIQ,YCbCr

4.YIQ颜色空间

    原始的NTSC系统用了一种YUV的变体进行颜色编码,这种变体称之为YIQ(I for“in-phase”and Qfor “quadrature”)。IQ分量是UV分量进行旋转和镜像之后的数值:

TV颜色空间—YUV,YIQ,YCbCr

  ß=0.576(33度)。Y分量同上述YUV颜色空间计算方式一样。

5.YCbCr颜色空

    YCbCr颜色空间是YUV颜色空间的一种变体,广泛应用于数字电视系统和图像压缩方面(比如JPEG)。色度分量Cb,Cr类似于U,V分量,也是通过亮度值与红色分量和蓝色分量差值之后,在赋予一定的权重计算得出。相比于YUV颜色空间,在RGB转换为YUV颜色空间的时候,其各个分量的权重值稍有不同。如下公式:

TV颜色空间—YUV,YIQ,YCbCr

  相应的从YCbCr转换为RGB颜色空间为:

TV颜色空间—YUV,YIQ,YCbCr

   BT.601中规定WR= 0.299,Wb=0.144,WG = 0.587,因此,上述公式变换为:

TV颜色空间—YUV,YIQ,YCbCr

   YCbCr转换为RGB公式为:

TV颜色空间—YUV,YIQ,YCbCr

    由于上述U,VI,Q,Cb,Cr可能为负数或正数,为了图像能够显示这些分量的负值,一般会在上述分量计算公式之后加上一个偏移量,使得其颜色分量为正值。比如,对于8bit表示一个分量的像素而言,其颜色分量的偏移量一般设置为128=2的7次方。

6.关键代码:

int RGB2YUV(IMAGE_TYPE *bmp_img, DWORD width, DWORD height,TYPE_YUV type) { T_U32 lineByte,Source_linebyte,source_index,dst_index; T_U16 i,j; T_U16 k = 0; T_U8 *Bmp8_img,*Source_img,R,G,B,*Y_img,*U_img,*V_img; int newbiBitCount =8,Y,U,V,I,Q,Cb,Cr; int colorTablesize; RGBQUAD colortable[256]; RGBQUAD *pColorTable1 = colortable; BITMAPFILEHEADER bf; BITMAPINFOHEADER bi; FILE *BMP2Y_fp = fopen("BMP2Y.bmp","wb"); FILE *BMP2U_fp = fopen("BMP2U.bmp","wb"); FILE *BMP2V_fp = fopen("BMP2V.bmp","wb"); if(NULL == BMP2Y_fp) { printf("Can't open BMP2Y.bmp\n"); return -1; } if(NULL == BMP2U_fp) { printf("Can't open BMP2U.bmp\n"); return -1; } if(NULL == BMP2V_fp) { printf("Can't open BMP2V.bmp\n"); return -1; } memset(&bf, 0, sizeof(bf)); memset(&bi, 0, sizeof(bi)); bf.bfType = (WORD)0x4d42; //8位图像数据每行字节数为4的倍数 lineByte = (width * newbiBitCount / 8 + 3) / 4 * 4; colorTablesize = 1024; bf.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+lineByte*height;//图像数据加上调色板信息和前两部分BMP文件信息 bf.bfReserved1 = 0; bf.bfReserved2 = 0; bf.bfOffbits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize;//注意此offset是BMP前三部分数据,也就是真正图像数据的前面几部分之和 bi.biSize = 40; bi.biHeight = height; bi.biWidth = width; bi.biPlanes = 1; bi.biCompression = 0; bi.biBitCount = newbiBitCount;//每一个像素由8 bits表示 bi.biSizeImage = lineByte*height; bi.biXPelsPerMeter = 0; bi.biYPelsPerMter = 0; bi.biClrImportant = 0; bi.biClrUsed = 0; Source_linebyte = WIDTHBYTES(width*24); Source_img = bmp_img+54; for (i = 0; i<256; ++i) { colortable[i].rgbBlue = i; colortable[i].rgbGreen = i; colortable[i].rgbRed = i; colortable[i].rgbReserved = 0; } fwrite(&bf,sizeof(BITMAPFILEHEADER),1,BMP2Y_fp); fwrite(&bi,sizeof(BITMAPINFOHEADER),1,BMP2Y_fp); fwrite(pColorTable1, sizeof(RGBQUAD), 256, BMP2Y_fp); fwrite(&bf,sizeof(BITMAPFILEHEADER),1,BMP2U_fp); fwrite(&bi,sizeof(BITMAPINFOHEADER),1,BMP2U_fp); fwrite(pColorTable1, sizeof(RGBQUAD), 256, BMP2U_fp); fwrite(&bf,sizeof(BITMAPFILEHEADER),1,BMP2V_fp); fwrite(&bi,sizeof(BITMAPINFOHEADER),1,BMP2V_fp); fwrite(pColorTable1, sizeof(RGBQUAD), 256, BMP2V_fp); Source_img = bmp_img+54; Y_img = (T_U8*)malloc(width*height); U_img = (T_U8*)malloc(width*height); V_img = (T_U8*)malloc(width*height); if(NULL == Y_img || NULL == U_img || NULL == V_img) { printf("Can't malloc YUV_img\n"); return -1; } switch (type) { case YUV: { for (i = 0; i < height;i++) { for (j = 0;j < width;j++) { source_index = Source_linebyte*i+3*j; dst_index = lineByte*i+j; R = Source_img[source_index+2]; G = Source_img[source_index+1]; B = Source_img[source_index]; #if 0 Y = 0.299*R+0.548*G+0.114*B; U = -0.147*R-0.289*G+0.436*B+128; V = 0.615*R-0.515*G-0.100*B+128; #endif Y = (306*R+561*G+117)>>10; U = (-150*R-296*G+446*B+)>>10; V = (630*R-527*G-102*G+)>>10; Y_img[dst_index] = (T_U8)Y; U_img[dst_index] = (T_U8)U; V_img[dst_index] = (T_U8)V; } } } case YIQ: { for (i = 0; i < height;i++) { for (j = 0;j < width;j++) { source_index = Source_linebyte*i+3*j; dst_index = lineByte*i+j; R = Source_img[source_index+2]; G = Source_img[source_index+1]; B = Source_img[source_index]; #if 1 Y = 0.299*R+0.548*G+0.114*B; U = -0.147*R-0.289*G+0.436*B; V = 0.615*R-0.515*G-0.100*B; #endif #if 0 Y = (306*R+561*G+117)>>10; U = (-150*R-296*G+446*B+)>>10; V = (630*R-527*G-102*G+)>>10; #endif I =(int) (-sin(0.576)*U+V*cos(0.576))+128; Q = (int)(U*cos(0.576)+V*sin(0.576))+128; Y_img[dst_index] = (T_U8)Y; U_img[dst_index] = (T_U8)I; V_img[dst_index] = (T_U8)Q; } } } case YCBCR: { for (i = 0; i < height;i++) { for (j = 0;j < width;j++) { source_index = Source_linebyte*i+3*j; dst_index = lineByte*i+j; R = Source_img[source_index+2]; G = Source_img[source_index+1]; B = Source_img[source_index]; #if 1 Y = 0.299*R+0.587*G+0.114*B; Cb = -0.169*R-0.331*G+0.5*B+128; Cr = 0.5*R-0.419*G-0.081*B+128; #endif #if 0 Y = (306*R+601*G+117)>>10; Cb = (-173*R-339*G+512*B+)>>10; Cr = (512*R-429*G-83*G+)>>10; #endif Y_img[dst_index] = (T_U8)Y; U_img[dst_index] = (T_U8)Cb; V_img[dst_index] = (T_U8)Cr; } } } break; } fwrite(Y_img, lineByte*height, 1, BMP2Y_fp); fwrite(U_img, lineByte*height, 1, BMP2U_fp); fwrite(V_img, lineByte*height, 1, BMP2V_fp); fclose(BMP2Y_fp); fclose(BMP2U_fp); fclose(BMP2V_fp); free(Y_img); free(U_img); free(V_img); return 0; } 

7.图像效果

TV颜色空间—YUV,YIQ,YCbCr

TV颜色空间—YUV,YIQ,YCbCr TV颜色空间—YUV,YIQ,YCbCr TV颜色空间—YUV,YIQ,YCbCr

YUV颜色空间的Y、U、V分量

TV颜色空间—YUV,YIQ,YCbCrTV颜色空间—YUV,YIQ,YCbCrTV颜色空间—YUV,YIQ,YCbCr

YIQ颜色空间的Y、I、Q分量
TV颜色空间—YUV,YIQ,YCbCr TV颜色空间—YUV,YIQ,YCbCr TV颜色空间—YUV,YIQ,YCbCr










免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/131794.html

(0)
上一篇 2025-08-05 16:10
下一篇 2025-08-05 16:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信