在人臉檢測中會用到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; ) { UCHAR r,g,b; r = sBuf[i+0]; g = sBuf[i+1]; b = sBuf[i+2]; dBuf[i+0]= (unsigned char)(r * 0.256789 + g * 0.504129 + b * 0.097906)+ 16; dBuf[i+1]= (unsigned char)(r *-0.148223 + g * -0.290992 + b * 0.439215)+ 128; dBuf[i+2]= (unsigned char)(r * 0.439215 + g * -0.367789 + b *-0.071426)+ 128; i += 3; }
|
// YCbCr轉換爲RGB
for(i =0 ; 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*(v - 128)); dBuf[i+1]= (unsigned char)(1.164383*(y- 16) - 0.391762*(u - 128) - 0.812969*(v - 128)); dBuf[i+2]= (unsigned char)(1.164383*(y- 16) + 2.017230*(u - 128) + 0 ); i += 3; }
|