从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. gulp基本介绍

    一.gulp是什么 gulp就是用来机械化的完成重复性质(如less->css:js.css压缩:js混淆)的工作:gulp的机制就是将重复工作抽象成一个个的任务. 二.gulp使用 a.首先确 ...

  2. 与你相遇好幸运,Postgresql和postgis安装

    笔者开发环境: windows 7 x86_64 一开始安装的是官网最新版 PostgreSQL 9.6 ,安装成功 之后安装PostGIS Bundle 2.2 for PostgreSQL x64 ...

  3. 【Java EE 学习 17 下】【数据库导出到Excel】【多条件查询方法】

    一.导出到Excel 1.使用DatabaseMetaData分析数据库的数据结构和相关信息. (1)测试得到所有数据库名: private static DataSource ds=DataSour ...

  4. 如何使用scikit—learn处理文本数据

    答案在这里:http://www.tuicool.com/articles/U3uiiu http://scikit-learn.org/stable/modules/feature_extracti ...

  5. 【转】c# Image获得图片路径的三种方法 winform

    代码如下:c# pictureBox1.Image的获得图片路径的三种方法 winform 1.绝对路径:this.pictureBox2.Image=Image.FromFile("D:\ ...

  6. Tomcat中JVM内存溢出及合理配置及maxThreads如何配置(转)

    来源:http://www.tot.name/html/20150530/20150530102930.htm Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚 ...

  7. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  8. 浏览器-03 WebKit 渲染1

    WebKit是一个渲染引擎,而不是一个浏览器; DOM是对HTML或者XML等文档的一种结构化表示方法,通过这种方式,用户可以通过提供标准的接口来访问页面中的任何元素的相关属性,并可对DOM进行相应的 ...

  9. iOS通知的使用

    注册:[[NSNotificationCenter defaultCenter] postNotificationName:@"changeColor" object:self]; ...

  10. 关于TFS地址改变后,项目迁移的问题。

    经常遇到TFS的服务器地址改变,以至于项目全部不能用,如果全部重新打开,然后重新映射,是件很费时.费事的事.但其实是有简单方法的. 找到解决方法文件,即SLN文件. 用记事本打开,找到SccTeamF ...