ここでは、拙作「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)の階調で量子化しており、
上図のように色差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変換を行っています。
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となります。
ここまで間引いてしまうと、さすがに劣化が目立ってきます。特に色差が最大になる青、赤色が階段状に見えるようになってしまいます。このフォーマットを利用する場合は、出来あがりの解像度より横の解像度を2倍にして取りこむか、YUV4:1:1→YUV4:4:4補完をしないと、色のブロック化が激しくなってしまいます。なぜかと言うと、
MPEG1は、上記のように縦横2ピクセルずつを一つの色差データで表す、YUV4:2:0と規定されています。このデータにエンコードする際に、元ソースが等倍のBtYUVだとすると、以下のようになっていしまいます。
実に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