原文参考:http://www.cnblogs.com/starspace/archive/2008/12/16/1356007.html
在人脸检测中会用到YCbCr颜色空间,因此就要进行RGB与YCbCr颜色空间的转换,刚开始以为这个很简单,只不是加减乘除的问题,根据公式就可以了,但事实是有很多的公式,我在Baidu上找的,几乎没有什么可以能用的,一般的只有RGB转YCbCr,但是反过来就不行了,算不到正确的结果。
我在图书馆找到一篇文章《数字RGB与YCbCr颜色空间转换的精度》作者:张懿,刘旭,李海峰,在这篇文章中找到了一个正确的相互转换的公式(也可能有误的)。在下面的公式中RGB和YCbCr各分量的值的范围均为0-255。
公式如下:
//数字RGB与YCbCr颜色空间转换的精度
//在这两个公式中RGB和YCbCr各分量的值的范围均为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 =0 ; i < dest->dwSize; ) |
// YCbCr转换为RGB for(i =0 ; i < dest->dwSize; ) |
我自己用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