色いろいろ
世の中にはいろいろな色の表現があります。
その中の一部を紹介したいと思います。
YUV表示
輝度信号(Y)と、輝度信号と赤色成分の差(U)、輝度信号と青色成分の差(V)の3つの情報で色を表す形式。
人間の目が色の変化よりも明るさの変化に敏感な性質を利用して、輝度情報により多くのデータ量を割り当てることで、少ない画質の劣化で高いデータ圧縮率を得ることができる。
テレビや、JPEG、MPEGなどの圧縮技術に用いられる。

RGBからの変換は以下のとおりです。
RGB → YUV
Y =  0.299 * R + 0.587 * G + 0.114 * B
U = -0.147 * R - 0.289 * G + 0.436 * B
V =  0.615 * R - 0.515 * G - 0.100 * B
YUV → RGB
R = Y + 0.000 * U + 1.140 * V
G = Y - 0.396 * U - 0.581 * V
B = Y + 2.029 * U + 0.000 * V
(注)画像はYUV空間の色をRGB空間に無理矢理変換したので、多少飽和しているところがあります。
YIQ表示
YUVと基本的に同じです。ただ表示系の角度を少し回転させただけです。

RGBからの変換は以下のとおりです。
RGB → YIQ
Y =  0.2990 * R + 0.5870 * G + 0.1140 * B
I =  0.5959 * R - 0.2750 * G + 0.3210 * B
Q =  0.2065 * R - 0.4969 * G - 0.2904 * B
YIQ → RGB
R = Y + 0.9489 * I + 0.6561 * Q
G = Y - 0.2645 * I - 0.6847 * Q
B = Y - 1.1270 * I + 1.8050 * Q
(注)画像はYUV空間の色をRGB空間に無理矢理変換したので、多少飽和しているところがあります。
HSV表示
より自然に近い色の表現(だと思う)。

RGBからの変換は以下のとおりです。
RGB → HSV
V = max( R, G, B )
S = ( V - X ) / V ただし X = min( R, G, B )
Hは次の式で表される。
R = V の場合 H = ( pi / 3 ) * ( b - g )
G = V の場合 H = ( pi / 3 ) * ( 2 + r - b )
B = V の場合 H = ( pi / 3 ) * ( 4 + g - r )
ただし r = ( V - R ) / ( V - X )
        g = ( V - G ) / ( V - X )
        b = ( V - B ) / ( V - X )
H     : 0 〜 360
S     : 0 〜 1
V     : 0 〜 1
R,G,B : 0 〜 1  とする。

この変換は少しわかりにくいので、プログラムを用意しました。
変換プログラム例
RGB → HSV
HSV → RGB


使い方
    double H,S,V,R,G,B;
    RGB2HSV( &H, &S, &V, R, G, B );	// R,G,B は 0 〜 1 の値
    HSV2RGB( &R, &G, &B, H, S, V );	// H は 0 〜 360, S, V は 0 〜 1 の値

戻る