Chinaunix首页 | 论坛 | 博客
  • 博客访问: 292993
  • 博文数量: 71
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 564
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-20 18:15
个人简介

用编程改变大众。。。

文章分类

全部博文(71)

文章存档

2016年(7)

2015年(54)

2014年(10)

我的朋友

分类: C/C++

2015-03-28 17:41:03

RGB

众所周知,任何彩色图像可由不同比例的红色、绿色和蓝色组合而成,即三基色原理。这种表示彩色图像的方法即RGB彩色空间。
        
彩色显象管(CRT)和液晶显示器件(LCD)可显示彩色图像,彩色摄像机中的电荷耦合器件(CCD)等传感器可产生彩色电视图像,都是根据RGB原理获得的。

YCbCr(YUV)

        人类视觉系统(HDV)对亮度比彩色更敏感,因此可以把亮度信息从彩色信息分离处来,并使之具有更高的清晰度,彩色信息的清晰度较低些,可显著压缩带宽,实现视频压缩的一部分,人的感觉却没有不同。


        如果亮度分量用Y表示,色度用Cb,Cr表示,则由大量实验得出:
         Y=0.299R+0.587G+0.114B     
        Cb=0.564(B-Y)
        Cr=0.713(R-Y)                                    
        反之,可由下式得到相应的R、G、B:
        R=Y+1.402Cr
        G=Y-0.344Cb-0.714Cr
        B=Y+1.772Cb   


***************************************************************************************************************
YUV转RGB实例
***************************************************************************************************************
  1. #include
  2. #include
  3. #include

  4. void yuvtorgb(double *, unsigned char *);
  5. void yuv422convertrgb(unsigned char *yuv_ptr,unsigned char *rgb_ptr,int width,int height);

  6. int main()
  7. {
  8.         int width = 640;
  9.         int height = 480;
  10.         int framesize = width * height;
  11.         unsigned char* indata = (unsigned char*) malloc (framesize*2*sizeof(char));
  12.         unsigned char* outdata = (unsigned char*) malloc ((framesize*3+54)*sizeof(char));
  13.         FILE *in,*out;
  14.         if((in=fopen("back.yuv","rb"))==NULL)
  15.         {
  16.              printf("can't open data.yuv");
  17.                  return 0;
  18.         }
  19.         if ((out = fopen("back.bmp","wb")) == NULL) {
  20.         printf("ERROR: can't write to rgb.bmp");
  21.         return 0;
  22.           }
  23.         fread(indata,framesize*2,1,in);
  24.         yuv422convertrgb (indata,outdata,width,height);
  25.         fwrite(outdata,(framesize*3+54),1,out);
  26.         fclose(out);

  27.         free(indata);
  28.         free(outdata);
  29.         return 1;

  30. }

  31. void yuv422convertrgb(unsigned char *yuv_ptr,unsigned char *rgb_ptr,int width,int height)
  32. {
  33.         int     i,j,k;
  34.         int     framesize_rgb;
  35.         double        rgb[3];
  36.         unsigned char    yuv[3];
  37.         unsigned char    *prgb,*pyuv;
  38.         
  39.         unsigned char    bmphead[] = {
  40.                                            0x42,0x4d,0x38,0xd2,0x0f,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x28,0x00,
  41.                                                                    0x00,0x00,0xD0,0x02,0x00,0x00,0xe0,0x01,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x00,
  42.                                                                    0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x0b,0x00,0x00,0x12,0x0b,0x00,0x00,0x00,0x00,
  43.                                                                    0x00,0x00,0x00,0x00,0x00,0x00};
  44.         

  45.         framesize_rgb = width * height * 3 + 54 ;

  46.         prgb = rgb_ptr;
  47.         for(i=0;i<54;i++)
  48.                 *prgb++ = bmphead[i];

  49.         pyuv = yuv_ptr;
  50.         
  51.     prgb = rgb_ptr + framesize_rgb - width * 3;
  52.         pyuv++;
  53.         
  54.         for(j=0;j
  55.         {
  56.                 k = 0;
  57.                 for(i=1;i
  58.                 {
  59.                         if( k%2==0 )
  60.                         {
  61.                                 yuv[0] = *pyuv--;
  62.                                 yuv[1] = *pyuv++;
  63.                                 yuv[2] = *(++pyuv);
  64.                                 pyuv++;
  65.                         }
  66.                         else
  67.                         {
  68.                                 yuv[0] = *pyuv++;
  69.                                 yuv[1] = *pyuv--;
  70.                                 yuv[2] = *(--pyuv);
  71.                                 pyuv++;
  72.                                 pyuv++;
  73.                                 pyuv++;
  74.                         }
  75.                         yuvtorgb(rgb,yuv);
  76.                         *prgb++ = (unsigned char )rgb[2];
  77.                         *prgb++ = (unsigned char )rgb[1];
  78.                         *prgb++ = (unsigned char )rgb[0];
  79.                 }
  80.                 prgb -= width * 3 * 2;
  81.         }
  82. }

  83. void yuvtorgb ( double *rgb,unsigned char *yuv)
  84. {
  85.          int i;
  86.          rgb[0] = 1.0 * yuv[0] + 0 + 1.402 * (yuv[2] - 128);                   // r
  87.          rgb[1] = 1.0 * yuv[0] - 0.34413 * (yuv[1] - 128) - 0.71414 * (yuv[2]-128);  // g
  88.          rgb[2] = 1.0 * yuv[0] + 1.772 * (yuv[1]-128) + 0;                            // b
  89.          for(i=0;i<3;i++)
  90.          {
  91.                 if(rgb[i]>255)
  92.                         rgb[i] = 255;
  93.                 if(rgb[i]<0)
  94.                         rgb[i] = 0;
  95.          }
  96. }

阅读(1684) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~