Coding Memorandum

プログラミングに関する備忘録

映像Codec屋から見たYJKカラー

この記事はMSX Advent Calendar 2015の3日目の記事です。

YJKカラーとは

MSX2規格では、画面解像度256x212, 表示色256色のグラフィックモードがある。カラーが256色であるため1ピクセルを1バイトで表わし、グラフィック1画面に必要なVRAMサイズは256x212x1byte(64KB弱)である。
1pixelの表現はRGB形式でG(3bit), R(3bit), B(2bit)の構成である。

Fig1

後継のMSX2+規格では、画面解像度は同じ256x212で表示色が19268色のグラフィックモードが用意された。このモードがすごいのは、表示色が増えたにも関わらずVRAMサイズはMSX2規格と同じ256x212byteに抑えていることである。

VRAMのサイズを変えずに表示色を増やす魔法のような方法がYJKカラー方式である。YJKカラーは光の3原色を用いたRGBとは異なり、輝度(Y)と色差(J,K)を使う方式である。

輝度,色差信号

RGB信号と輝度・色差信号の関係の一般形は次のように表わされる。色の輝度成分(Y)はR,G,Bの1次式で表わされる。

k1,k2,k3の値は規格(後述)で決められる。 ちなみに、輝度=明るさであり、輝度成分(Y)のみの画像を作るとモノクロ画像になる。コンピュータビジョンの前処理として、輝度成分の抽出処理(=モノクロ化)がよく行われる。

色差はR,G,Bの各値から輝度を引いた値である。

色差信号3つのうち1つは、輝度と2つの色差があれば求められるので色差信号は2信号で表現する。

色差の値域は輝度に比べて大きくなるため、色差の値を正規化する表現もある。Yが0.0~1.0の間の値を取るときに色差が-0.5~+0.5の範囲になるように調整するなどである。

輝度・色差信号のメジャーな規格にITU-R BT.601、HDTV用の ITU-R BT.709 勧告がある。JPEGやMPEG形式で用いられるカラー信号である。規格書は次で入手できる。また、最近4K/8K用にITU-R BT.2020が勧告された。

https://www.itu.int/rec/R-REC-BT.601/en
https://www.itu.int/rec/R-REC-BT.709/en
https://www.itu.int/rec/R-REC-BT.2020/en

ITU-R BT.601では、Yと色差(Cb, Cr)を次の式で定める。

ITU-R BT.709では、次の式である。

MSX規格で用いるYJKは次のように定義されている。

各式の係数の分母が2の累乗になっているあたりは、ビデオチップ(V9958)の回路が作りやすいという理由があるような気がします。割り算命令を持っていないCPU Z80にとっても負担の少ない計算式です。

色差の間引き

RGB信号と輝度・色差信号は相互に変換することができる。RGB信号ではなく、輝度・色差信号を用いるメリットは情報の圧縮にある。
人の視覚は、輝度変化には敏感であるが、色差の変化には鈍感であるという特性がある。この特性を利用して色差信号を削減する。

一般的な色差信号の間引きの方式には、次のものがある。下記では色差信号はU,Vと表現する。

■ YUV 4:2:0

Fig2

2x2ピクセルに対して、一つの色差信号(U,V)を割り当てる。デジタル放送でも使われている方式であり、皆さんが普段テレビで目にする映像はこの形式の画である。

■ YUV 4:1:1

Fig3

4x1ピクセルに対して、一つ色差信号(U,V)を割り当てる。DVカメラで使われる方式である。

■ YUV 4:2:2

Fig4

2x1ピクセルに対して、一つ色差信号(U,V)を割り当てる。業務用/放送制作用で使われる(XDCAM HD422,XAVC,P2 AVC-Intra100)。


■ YJK

YJKは、YUV 4:1:1と同じ形で4x1ピクセルに対して1つのJ、K値を割り当てる。

Fig5


ちなみにアナログ放送で使われていたNTSCは、色差を調整して視覚感度の高いI信号と感度の低いQ信号に分け、色差信号の間で信号量に差を持たせている。Y:I:Q = 4.2:1.3:0.4

量子化ビット数

色信号(連続値:例えば0.0~1.0)をコンピュータで扱うためには、量子化(=デジタル化、符号化)が行われる。例えば、8bit=1byteで信号を符号化すると連続値0.0~1.0の値は0~255にマッピングされる。

この例における”8bit”を量子化ビット数と呼ぶ。量子化ビット数が大きいほど信号の分解能が高くなるがデータ量が増える。色信号の場合は、量子化ビット数が増えると中間色の表現が増えることになる。量子化ビット数が小さいと信号の分解能が低くなり、元信号との誤差が大きくなる。この誤差は量子化誤差と呼ばれる。

MSX2+規格のYJKのVRAM上での表現は次のようである。

Fig6

Y信号は5bit(0~31),J,K信号は6bit(-32~31)で符号化される。4pixelは4byteで表現され、1pixelあたり1byteで表現できている。
[参考] JPEG,MPEG-2,H.264はYUVの各値を8bitで扱っている。(H.264は10bit,JPEGは12bitで扱うモードもある)

色数はJ,Kが64階調であり、Yは32階調である。これらの値を組み合わせると64x64x32=131072色が表現可能である。しかしながら、ビデオチップの中でビデオ信号出力のためにYJKからRGBへの変換が行われ、ここでRGBはそれぞれ5bitで扱われてしまう。このため、色数が32768色(32x32x32)となるが、さらに色の重複を除くと19268色となる。この辺りは下記の資料が詳しい。

http://marmsx.msxall.com/artigos/sc12en.pdf

YJKカラーを使う

YJKカラーを出力するプログラム(MSX-BASIC)を作成してみた。プログラムは、RGB 24bit(RGBの各値を8bitで表わす)のBitmapファイルを読み込んでMSX2+のSCREEN12に出力するものである。Bitmapファイルは256x212のサイズのものである。
行20にBitmapファイル名を指定する。

10 SCREEN 12
20 OPEN "mandrill.BMP" AS #1 LEN=6
30 FIELD #1, 1 AS B1$, 1 AS G1$, 1 AS R1$, 1 AS B2$, 1 AS G2$, 1 AS R2$
40 P = 0
50 FOR Y = 0 TO 211
60 FOR X = 1 TO 128
70 GET #1, 9+(211-Y)*128+X
80 R1 = ASC(R1$) : G1 = ASC(G1$) : B1 = ASC(B1$)
90 R2 = ASC(R2$) : G2 = ASC(G2$) : B2 = ASC(B2$)
100 X = X+1 : GET #1, 9+(211-Y)*128+X
110 R3 = ASC(R1$) : G3 = ASC(G1$) : B3 = ASC(B1$)
120 R4 = ASC(R2$) : G4 = ASC(G2$) : B4 = ASC(B2$)
130 Y1 = B1/2 + R1/4 + G1/8 : J1 = R1 - Y1 : K1 = G1 - Y1
140 Y2 = B2/2 + R2/4 + G2/8 : J2 = R2 - Y2 : K2 = G2 - Y2
150 Y3 = B3/2 + R3/4 + G3/8 : J3 = R3 - Y3 : K3 = G3 - Y3
160 Y4 = B4/2 + R4/4 + G4/8 : J4 = R4 - Y4 : K4 = G4 - Y4
170 Y1 = INT((Y1+4)/8)*8
180 Y2 = INT((Y2+4)/8)*8
190 Y3 = INT((Y3+4)/8)*8
200 Y4 = INT((Y4+4)/8)*8
210 J = (J1+J2+J3+J4)/4 : K = (K1+K2+K3+K4)/4
220 J = INT((J+4)/8) : K = INT((K+4)/8)
230 IF J > 31 THEN J = 31 ELSE IF J < -32 THEN J = -32
240 IF K > 31 THEN K = 31 ELSE IF K < -32 THEN K = -32
250 JL = J AND 7 : JH = INT(J / 8) AND 7
260 KL = K AND 7 : KH = INT(K / 8) AND 7
270 Y1 = Y1 OR KL : Y2 = Y2 OR KH : Y3 = Y3 OR JL : Y4 = Y4 OR JH
280 VPOKE P, Y1 : P = P + 1
290 VPOKE P, Y2 : P = P + 1
300 VPOKE P, Y3 : P = P + 1
310 VPOKE P, Y4 : P = P + 1
320 NEXT X
330 NEXT Y
340 CLOSE #1
350 A$ = INPUT$(1)

標準画像として良く使われるLennaとMandrillの画像の表示結果は次のようである。

元画像(RGB 24bit)

YJK画像

LennaLenna_SC12

元画像(RGB 24bit)

YJK画像

MandrillMandrill_SC12

YJK画像の方は、量子化ビット数が低いため量子化誤差が目立っている。特に輝度・色が大きく変わる物体の境界部分で誤差が目立つ。色の再現度は思っていた以上に高いと思う。

J,Kを0とし、Y成分のみを描画した画像は次のようである。

YJK画像(Yのみ)

Lenna_SC12_Y

YJKでは、Y成分に青(B)成分が入ってしまうため、少し青みがかった画像となっている。Y成分は1ピクセル毎に値を持つため、物体の境界部分ははっきりと表現できている。しかしながら、32階調であるため背景のグラデーション部分で量子化の誤差が目立ってしまっている。

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://msirocoder.blog35.fc2.com/tb.php/90-95031ba7
この記事にトラックバックする(FC2ブログユーザー)