转:RGB与YCbCr颜色空间的转换(高精度测试)

本文介绍了RGB与YCbCr颜色空间之间的精确转换方法,并提供了实际应用中的转换公式及MATLAB验证示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文参考:http://www.cnblogs.com/starspace/archive/2008/12/16/1356007.html

RGBYCbCr颜色空间的转换

    在人脸检测中会用到YCbCr颜色空间,因此就要进行RGBYCbCr颜色空间的转换,刚开始以为这个很简单,只不是加减乘除的问题,根据公式就可以了,但事实是有很多的公式,我在Baidu上找的,几乎没有什么可以能用的,一般的只有RGBYCbCr,但是反过来就不行了,算不到正确的结果。

    我在图书馆找到一篇文章《数字RGBYCbCr颜色空间转换的精度》作者:张懿,刘旭,李海峰,在这篇文章中找到了一个正确的相互转换的公式(也可能有误的)。在下面的公式中RGBYCbCr各分量的值的范围均为0-255

公式如下:

//数字RGBYCbCr颜色空间转换的精度 

//在这两个公式中RGBYCbCr各分量的值的范围均为0-255

// RGB转换为YCbCr

// 这个公式来自:Genesis Microchip. gm6010/gm6015 Programming Guide[M]. California US: Genesis Microchip Company, 2002:85-90

// |Y   |    |16  |                    |65.738   129.057  25.06 |   |R|
// |Cb| = |128| + (1/256)*|-37.945  -74.494  112.43| *|G|
// |Cr |    |128|                   |112.439  -94.154  -18.28|   |B|

// YCbCr转换为RGB

// 这个公式来自:Genesis Microchip. gm6015 Preliminary Data Sheet[M]. California US: Genesis Microchip Company, 2001:33-34
//|R|                   |298.082  0               408.58 |   |Y   -16  |
//|G| = (1/256)*|298.082  -100.291 -208.12|* |Cb-128|
//|B|                   |298.082  516.411   0           |   |Cr -128|

 

加一点我的代码,为什么要加我的代码呢,不是因为写的代码好,只不过是我把上面公式中的矩阵/256算成小数了,这样子我们可以省点时间:

 

// RGB转换为YCbCr

for(=; i < dest->dwSize; )
{
 UCHAR r,g,b;
 r = sBuf[i+0];
 g = sBuf[i+1];
 b = sBuf[i+2];
 dBuf[i+0]= (unsigned char)(* 0.256789 + g * 0.504129 + b * 0.097906)+ 16; 
 dBuf[i+1]= (unsigned char)(*-0.148223 + g * -0.290992 + b * 0.439215)+ 128;
 dBuf[i+2]= (unsigned char)(* 0.439215 + g * -0.367789 + b *-0.071426)+ 128; 
 i += 3;
}

 

 

// YCbCr转换为RGB

for(=; i < dest->dwSize; )
{
 UCHAR y,u,v;
 y = sBuf[i+0];
 u = sBuf[i+1];
 v = sBuf[i+2];
 dBuf[i+0]= (unsigned char)(1.164383*(y- 16) + 0 + 1.596027*(- 128)); 
 dBuf[i+1]= (unsigned char)(1.164383*(y- 16) - 0.391762*(- 128) - 0.812969*(- 128)); 
 dBuf[i+2]= (unsigned char)(1.164383*(y- 16) + 2.017230*(- 128) + 0 );
 i += 3;
}


我自己用MATLAB测试了一组数据(参数稍微调整了一下,也借鉴了一下其他的文章)

%{
工程:Y CB CR转 RGB 以及RGB转Y CB CR
时间:2014年8月13日09:34:53
整理:天空之恋
说明:
    由于需要在DM642上将YCbCr信号转到RGB,借了一本书,套用书上的转换公式
结果弄出来的图像一直都是错误的,彩色失真。通过在线调试,发现从RGB装换过来的YCbCr
和转换前的输入相差太大。然后在MATLAB上用那个公式对一个像素进行转换时也是不正确,
差点给气死。。
round()是四舍五入函数
%}
clc;
ycbcr=[1.164 0 1.596;1.164 -0.392 -0.813;1.164 2.017 0]
y=86;
cb=86;
cr=115;
y0=[y-16;cb-128;cr-128]
rgb0=ycbcr*y0
rgb0=round(rgb0)
rgb1=[0.257 0.504 0.098 ; -0.148 -0.291 0.439; 0.439 -0.368 -0.071]
t0=[16;128;128]
result00=round(rgb1*rgb0+t0)
err00=[y;cb;cr]-result00

最终结果:

result00 =
    86
    86
   115
err00 =
     0
     0
     0



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值