RGB與YCbCr顏色空間的轉換

RGB與YCbCr顏色空間的轉換
    在人臉檢測中會用到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;
}

發佈了21 篇原創文章 · 獲贊 24 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章