RGB转YCbCr
从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的更多相关文章
- 基于MATLAB的RGB转YCBCR色彩空间转换
使用MATLAB进行图片的处理十分方便,看它的名字就知道了,矩阵实验室(matrix laboratory).一副图片的像素数据可以看成是一个二维数组一个大矩阵,MTABLAB就是为矩阵运算而生. M ...
- 视频图像处理基础知识5(RGB与Ycbcr相互转换公式 )【转】
转自:http://blog.csdn.net/Times_poem/article/details/51471438 版权声明:本文为博主原创文章,未经博主允许不得转载. 需求说明:视频处理算法基本 ...
- RGB 与 (RGB转 YCbCr再转为 RGB)的图像
RGB 与 (RGB转 YCbCr再转为 RGB)的图像 不可逆,能够从 矩阵的逆运算看出来. 附上 matlab 代码: clc,clear; Source=imr ...
- RGB,YCBCR在HDMI传输线是数据排列
RGB4:4:4 YCbCr4:4:4 YCbCr4:2:2 YCbCr4:2:0
- RGB颜色空间与YCbCr颜色空间的互转
在人脸检测中会用到YCbCr颜色空间,因此就要进行RGB与YCbCr颜色空间的转换.在下面的公式中RGB和YCbCr各分量的值的范围均为0-255. RGB转到YCbCr: float y= (col ...
- 实现RGB,CMY(K),YUV,YIQ,YCbCr颜色的转换算法
源:http://blog.sina.com.cn/s/blog_4d80055a01000atu.html import java.lang.Math; import java.awt.*; pub ...
- [#1] YCbCr与RGB的转换公式
1 YCbCr简介 YCbCr颜色空间是将RGB颜色空间进行坐标转换后得到的,常用于数字电视系统.Y取值范围:16~235 Cb.Cr的取值范围:16~240 YCbCr经常和YUV混淆.两者的主要差 ...
- 算法优化:rgb向yuv的转化最优算法,快得让你吃惊!
朋友曾经给我推荐了一个有关代码优化的pdf文档<让你的软件飞起来>,看完之后,感受颇深.为了推广其,同时也为了自己加深印象,故将其总结为word文档.下面就是其的详细内容总结,希望能于己于 ...
- YUV / RGB 格式及快速转换算法
1 前言 自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用 的过程,所以在不同的应用领域中为了更好更准确 ...
随机推荐
- gcc编译时头文件和库文件搜索路径
特殊情况:用户自定义的头文件使用#include"mylib"时,gcc编译器会从当前目录查找头文件 一.头文件 gcc 在编译时寻找所需要的头文件 : ※搜寻会从-I开始( ...
- C++ 基础知识复习(三)
43. 继承的几种方式: 答:共有继承public,保护继承protected,私有继承private.其中后两种继承会改变原有的访问级别. 44. 深复制与浅复制: 答:简单理解,深复制自己申请了内 ...
- scala中的面向对象定义类,构造函数,继承
我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...
- js验证输入的金钱格式
<html> <head> <title>js验证输入的金钱格式</title> <script type="text/javascri ...
- Nginx反向代理的工作方式
如图所示: 当客户端发来HTTP请求时,Nginx并不会立刻转发到上游服务器,而是先把用户的请求(包括HTTP包体)完整地接收到Nginx所在服务器的硬盘或者内存中,然后再向上游服务器发起连接,把缓存 ...
- PAT A 1115. Counting Nodes in a BST (30)【二叉排序树】
题目:二叉排序树,统计最后两层节点个数 思路:数组格式存储,insert建树,dfs遍历 #include<cstdio> #include<iostream> #includ ...
- CodeForces 103D 分块处理
题目链接:http://codeforces.com/problemset/problem/103/D 题意:给定一个长度为n的序列.然后q个询问.每个询问为(a,b),表示从序列第a项开始每b项的加 ...
- 首师大附中互测题:99999999海岛帝国后传:算法大会【D001】
[D001]99999999海岛帝国后传:算法大会[难度:D] ———————————————————————————————————————————————————————————————————— ...
- Linux之head、tail、grep、cut等命令详解
http://jingyan.baidu.com/article/5225f26b6ab230e6fa0908be.html
- 2016 Multi-University Training Contest 4
6/12 2016 Multi-University Training Contest 4官方题解 KMP+DP A Another Meaning(CYD) 题意: 给一段字符,同时给定你一个单词, ...