カラーフォーマットのナゾ

 ここでは、拙作「GExt」によって拡張できるカラーフォーマットについて解説したいと思います。

カラーフォーマットとは?
 カラーフォーマット(ピクセルフォーマットとも言われる)とは、動画キャプチャの際の色数(正確にはDWORDのデータの並び)を指します。良く聞くのは、Windowsの色数でも有る「RGB24Bit」とか「RGB16Bit」でしょう。動画の場合は、さらにYUVとか聞き慣れない言葉が出てきます。それぞれ解説してみます。

NTSCの色空間
 まず、大元のNTSCでの色はどうなっているか説明しましょう。NTSCは、白黒放送との互換性を保つため、輝度信号(白黒信号)と色差信号(色信号)から成っています。輝度はY、色差はCと表現され、よくビデオなどで聞かれる「3次元YC分離」とは、この輝度信号と色差信号を高精度に分離する仕組みです。

 脱線しました。NTSCをパソコンで扱うときは、このYC信号をサンプリングして、量子化したデータを用います。もともと、NTSCでは色差C信号は輝度Y信号の半分の情報しか無いので、サンプリングもCはYの半分になっています。さらに、CはRGBに計算しやすく赤と青に分けられ、Cb(Blue色差)、Cr(Red色差)になり、最終的にYCbCrデータとなります。

 先ほど書いた通り、色差が輝度の半分しかないため、YCbCrは2:1:1のデータ量の比率になります。Bt8x8ではYCbCrそれぞれ8Bit(256)の階調で量子化しており、

NTSCのカラーフォーマット

上図のように色差CbCrは2ピクセルで一つの情報として扱っています。1ピクセルあたり8bit+4bit+4bit=16Bitとなり、このフォーマットを「YUV4:2:2」と呼びます。なぜYUVと言うのかは良く知りませんが、パソコンでRGBに対し輝度、色差で表すことを「YUV」と表現する事から来ていると思います。本来、YUVとはヨーロッパのTV放送の色空間を指すんですがねえ。。。

 それから、RGBにしろ、YCbCrにしろ、3つの要素から色を表す事から、これらを「色空間(Color Space)」と呼びます。色空間変換と言うと、通常はRGB←→YCbCr(パソコンではYUVと表現される)の変換を指します。

RGB24Bit
 まずは、RGB24Bitから。前述の通り、取りこんだデータはYUV4:2:2形式なので、Bt8x8ではまず、YUV4:4:4に色差成分を補完し、その後YUV→RGB変換を行っています。

RGBのカラーフォーマット

YUV→RGB変換式は以下の通りです。

    R=1.164(Y-16)+1.596(Cr-128)
    G=1.164(Y-16)-0.813(Cr-128)-0.391(Cb-128)
    B=1.164(Y-16)+2.018(Cb-128)

    Y range=[16,235]
    Cb/Cr range=[16,240]
    RGB range=[0,255]

RGBA32Bit
 RGBA32bitは、アルファチャネルと呼ばれる編集用ビットストリームを付加したデータだそうです。が、Bt8x8の場合、RGB24bitのデータにBit0で埋めた8bitを付加しているだけなので、全く意味がありません(^^;;; 転送データ量も多くなるだけの、使い道の無いカラーフォーマットです。

RGB16Bit
 正確には、RGB555の、RGB15bitです。これはRGBそれぞれ5bitの階調で表現したもので、それだけ色の階調が損なわれます。また、Bt8x8の場合、データに余分な1bitを付加した16bitで扱っています。最初から16bitで描かれたCG等はほとんど気にならないのですが、ことキャプチャに関して言うと、RGB16bitでも階調が不足して画面が汚くなります。あまりお勧めできません。

YUY2、UYVY
 GExtの目玉の一つです(^^) この二つは、DWORDのデータの並び方が異なるだけで、カラーフォーマットとしてはYUV4:2:2と、NTSCと同じフォーマットです。前述の通り、色差が輝度の半分の解像度しかありませんが、もともと人間の目が輝度よりも色差に鈍感という性質(目を構成する細胞の比率が根拠との事)があるため、ほとんど劣化が感じられません。また、1ピクセルあたりのデータ量がRGB16bitと同じく8+4+4=16Bitになるため、転送量と画質のバランスが最もとれているフォーマットであり、おすすめです(^^)

BtYUV
 これはDVと同じ、YUV4:1:1のデータです。色差をサブサンプリング(間引き)を行って、横4ピクセルを一つの色差データで表します。このとき、1ピクセルあたりのデータ量は、8+2+2=12bitとなります。

YUV4:1:1のカラーフォーマット

ここまで間引いてしまうと、さすがに劣化が目立ってきます。特に色差が最大になる青、赤色が階段状に見えるようになってしまいます。このフォーマットを利用する場合は、出来あがりの解像度より横の解像度を2倍にして取りこむか、YUV4:1:1→YUV4:4:4補完をしないと、色のブロック化が激しくなってしまいます。なぜかと言うと、

YUV4:2:0のカラーフォーマット

MPEG1は、上記のように縦横2ピクセルずつを一つの色差データで表す、YUV4:2:0と規定されています。このデータにエンコードする際に、元ソースが等倍のBtYUVだとすると、以下のようになっていしまいます。

BtYUVのMPEG1

実に8ピクセルも同一の色差データを用いてしまうので、さすがにこれでは綺麗な動画とは言えませんね(^^;;;

YVU9
 これは、BtYUVのYUV4:1:1なフォーマットを、さらに縦方向にも1/4に間引き、YUV4:1:0と言えるフォーマットです。この場合、16ピクセルもの画素を同一の色差データで表すため、ブロック化が激しいと思います。ただ、1ピクセルあたりのデータ量は、8+0.5+0.5=9bitと、グレースケール(8bit)に迫るデータ量の少なさが唯一の美点でしょうか。ま、使う人は少ないでしょう(^^;;;

まとめ
  • RGBA32Bitの使い道無し。
  • RGB24bitがスタンダード?
  • 横ラインずれノイズに悩む人は、RGB16bitよりもYUY2、UYVYがおすすめ。
  • BtYUVを使うときは、高解像度で。
  • どうしても転送が間に合わないときはYVU9で。

こんなところでしょうか(^^;;;

謝辞
 このページを作成するに当たり、vagrantzさんのページである「VOB2MPEG」を参考にさせていただきました。特に解説の図なんてパクリです(^^;;; この場を借りて御礼申し上げますm(__)m

戻る