从RGB转换成YCbCr

//  Purpose:      
//          Save RGB->YCC colorspace conversion for reuse, only computing once  
//          so dont need multiply in color conversion later  

/* Notes:
*
* YCbCr is defined per CCIR 601-1, except that Cb and Cr are
* normalized to the range 0 .. 255 rather than -0.5 .. 0.5.
* The conversion equations to be implemented are therefore
*
*  Y  =  0.29900 * R + 0.58700 * G + 0.11400 * B
*  Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B  + 128
*  Cr =  0.50000 * R - 0.41869 * G - 0.08131 * B  + 128
*
* (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
* To avoid floating-point arithmetic, we represent the fractional constants
* as integers scaled up by 2^16 (about 4 digits precision); we have to divide
* the products by 2^16, with appropriate rounding, to get the correct answer.
*/
void CMainFrame::InitColorTable( void )
{
    int i;
    int nScale    = 1L << 16;        //(1为长整形,左移16位 =2^16)
    int CBCR_OFFSET = 128<<16;

    /*
    *   nHalf is for (y, cb, cr) rounding, equal to (1L<<16)*0.5
    *   If (R,G,B)=(0,0,1), then Cb = 128.5, should round to 129
    *   Using these tables will produce 129 too:
    *   Cb  = (int)((RToCb[0] + GToCb[0] + BToCb[1]) >> 16)
    *       = (int)(( 0 + 0 + 1L<<15 + 1L<<15 + 128 * 1L<<16 ) >> 16)
    *       = (int)(( 1L<<16 + 128 * 1L<<16 ) >> 16 )
    *       = 129
    */
    /*
    *  Y  =  0.29900 * R + 0.58700 * G + 0.11400 * B
*  Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B  + 128
*  Cr =  0.50000 * R - 0.41869 * G - 0.08131 * B  + 128
    */    
    int nHalf = nScale >> 1;    

    for( i=0; i<256; i++ )
    {
        m_RToY[ i ]    = (int)( 0.29900 * nScale + 0.5 ) * i;
        m_GToY[ i ]    = (int)( 0.58700 * nScale + 0.5 ) * i;
        m_BToY[ i ]    = (int)( 0.11400 * nScale + 0.5 ) * i + nHalf;

        m_RToCb[ i ] = (int)( 0.16874 * nScale + 0.5 ) * (-i);
        m_GToCb[ i ] = (int)( 0.33126 * nScale + 0.5 ) * (-i);
        m_BToCb[ i ] = (int)( 0.50000 * nScale + 0.5 ) * i +
                                        CBCR_OFFSET + nHalf - 1;

        m_RToCr[ i ] = m_BToCb[ i ];
        m_GToCr[ i ] = (int)( 0.41869 * nScale + 0.5 ) * (-i);
        m_BToCr[ i ] = (int)( 0.08131 * nScale + 0.5 ) * (-i);
    }
}

////////////////////////////////////////////////////////////////////////////////
//    颜色转换
//  Color convertion from bgr to ycbcr for one tile, 16*16 pixels  
//  Actually being not used for efficiency !!!!! Please use BGRToYCbCrEx()  

void CMainFrame::BGRToYCbCr(BYTE * pBgr,BYTE * pY,BYTE * pCb,BYTE * pCr)
{
    int i;
    BYTE r, g, b, *pByte = pBgr, *py = pY, *pcb = pCb, *pcr = pCr;
    for( i=0; i<256; i++ )
    {
        b = *(pByte ++);
        g = *(pByte ++);
        r = *(pByte ++);

        *(py++)     = (unsigned char)((m_RToY[r]  + m_GToY[g]  + m_BToY[b] )>>16);
        *(pcb++) = (unsigned char)((m_RToCb[r] + m_GToCb[g] + m_BToCb[b])>>16);
        *(pcr++) = (unsigned char)((m_RToCr[r] + m_GToCr[g] + m_BToCr[b])>>16);
    }
}

//* pBlock
    //输出, Y: 256; Cb: 64; Cr: 64 , 指向一块长度为384的内存区域
    // [0,63]存储亮度信号block0
    // [64,127]存储亮度信号block1
    // [128,191]存储亮度信号block2
    // [192,255]存储亮度信号block3
    // [256,319]存储色度信号 Cb
    // [320,383]存储色度信号 Cr
void CMainFrame::BGRToYCbCrEx(unsigned char * pBgr,    int * pBlock)
    
{
    int x, y, *py[4], *pcb, *pcr;
    unsigned char r, g, b, *pByte;
    pByte = pBgr;
    for( x = 0; x < 4; x++ )
    py[ x ] = pBlock + 64 * x;
    pcb      = pBlock + 256;
    pcr   = pBlock + 320;

    for( y=0; y<16; y++ )
    {
        for( x=0; x<16; x++ )
        {
            b = *(pByte ++);
            g = *(pByte ++);
            r = *(pByte ++);  // 取出连续的R G B的值

            //    block number is ((y/8) * 2 + x/8): 0, 1, 2, 3
            //  计算出各block(8*8)中亮度信号的值,取值范围 [-127,127]
            *( py[((y>>3)<<1) + (x>>3)] ++ ) =
                ((m_RToY[ r ]  + m_GToY[ g ]  + m_BToY[ b ] )>>16) -128;    

            //    Equal to: (( x%2 == 0 )&&( y%2 == 0 ))
            // 计算出两个色度信号的值,取值范围[-127,127]
            if( (!(y & 1L)) && (!(x & 1L)) )
            {
                *(pcb++) =
                    ((m_RToCb[ r ] + m_GToCb[ g ] + m_BToCb[ b ])>>16) -128;
                *(pcr++) =
                    ((m_RToCr[ r ] + m_GToCr[ g ] + m_BToCr[ b ])>>16) -128;
            }
        }
    }
}

RGB转YCbCr的更多相关文章

  1. 基于MATLAB的RGB转YCBCR色彩空间转换

    使用MATLAB进行图片的处理十分方便,看它的名字就知道了,矩阵实验室(matrix laboratory).一副图片的像素数据可以看成是一个二维数组一个大矩阵,MTABLAB就是为矩阵运算而生. M ...

  2. 视频图像处理基础知识5(RGB与Ycbcr相互转换公式 )【转】

    转自:http://blog.csdn.net/Times_poem/article/details/51471438 版权声明:本文为博主原创文章,未经博主允许不得转载. 需求说明:视频处理算法基本 ...

  3. RGB 与 (RGB转 YCbCr再转为 RGB)的图像

           RGB 与 (RGB转 YCbCr再转为 RGB)的图像   不可逆,能够从 矩阵的逆运算看出来. 附上 matlab 代码:         clc,clear; Source=imr ...

  4. RGB,YCBCR在HDMI传输线是数据排列

    RGB4:4:4 YCbCr4:4:4 YCbCr4:2:2 YCbCr4:2:0

  5. RGB颜色空间与YCbCr颜色空间的互转

    在人脸检测中会用到YCbCr颜色空间,因此就要进行RGB与YCbCr颜色空间的转换.在下面的公式中RGB和YCbCr各分量的值的范围均为0-255. RGB转到YCbCr: float y= (col ...

  6. 实现RGB,CMY(K),YUV,YIQ,YCbCr颜色的转换算法

    源:http://blog.sina.com.cn/s/blog_4d80055a01000atu.html import java.lang.Math; import java.awt.*; pub ...

  7. [#1] YCbCr与RGB的转换公式

    1 YCbCr简介 YCbCr颜色空间是将RGB颜色空间进行坐标转换后得到的,常用于数字电视系统.Y取值范围:16~235 Cb.Cr的取值范围:16~240 YCbCr经常和YUV混淆.两者的主要差 ...

  8. 算法优化:rgb向yuv的转化最优算法,快得让你吃惊!

    朋友曾经给我推荐了一个有关代码优化的pdf文档<让你的软件飞起来>,看完之后,感受颇深.为了推广其,同时也为了自己加深印象,故将其总结为word文档.下面就是其的详细内容总结,希望能于己于 ...

  9. YUV / RGB 格式及快速转换算法

    1 前言 自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用 的过程,所以在不同的应用领域中为了更好更准确 ...

随机推荐

  1. virtualbox之usb设备的分配

    来源:http://www.cnblogs.com/fsjohnhuang/p/3987545.html 首先下载安装virtualbox的扩展包,因为box原本不支持usb设备.www.virtua ...

  2. yii框架中验证器声明一组内置验证器可以使用短名称引用

    1.内置验证器的短名称分别有: boolean: yii\validators\BooleanValidator captcha: yii\captcha\CaptchaValidator compa ...

  3. poi导出word、excel

    在实际的项目开发中,经常会有一些涉及到导入导出的文档的功能.apache开源项目之一poi对此有很好的支持,对之前的使用做一些简要的总结. 1,导入jar 为了保证对格式的兼容性,在项目的pom.xm ...

  4. 适配器模式/adapter模式/结构型模式

    定义 将类的接口转化为客户端希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作,别名Wrapper(包装器). 适配器模式,最终改变一个已有对象的接口. 使用场景 当有那么个类, ...

  5. mac 下 用 glfw3 搭建opengl开发环境

    mac 下 用 glfw3 搭建opengl开发环境 下载编译 glfw3 Build Setting 里面, Library Search Paths -> 设置好编译 glfw 库的路径 H ...

  6. VMware如何实现和主机共享网络上网

    VMware虚拟机的三种联网方法及原理 一.Brigde--桥接  :默认使用VMnet0 1.原理: Bridge  桥"就是一个主机,这个机器拥有两块网卡,分别处于两个局域网中,同时在& ...

  7. json-lib——JsonConfig详细使用说明

    在使用json-lib包中JSONObject.fromObject(bean,cfg)时,可能出现以下几种情况: 1.(防止自包含)转换的对象包含自身对象,或者对象A下面挂了对象B,对象B下面又挂了 ...

  8. JavaScript预解析1

    var 不一定是用来定义局部变量的 jscript的全局变量和局部变量的分界是这样的:                  过程体(包括方法function,对象Object o ={})外的所有变量不 ...

  9. language level in Intellij IDEA

    The Language level setting sets which features the code assistance in the editor should support. For ...

  10. Leetcode Substring with Concatenation of All Words

    You are given a string, S, and a list of words, L, that are all of the same length. Find all startin ...