YUVを扱うとき最低限これだけは抑えておこう。
YUVとは?
まず抑えておいてほしいのはYUVは画像フォーマットであるが「YUVはRGBのように赤緑青で保存していない」ということ。具体的にどのように保存されるかは後述する。
Q.そもそもなぜYUVを使うのか。
ディスプレイ表示などする場合最終的にビデオメモリにはRGB形式で画像が配置されることがほとんど、ならなぜYUVなどというフォーマットを使用するのか?
A.データ効率が良いから(+歴史的経緯)
RGBが色を赤、緑、青の3つに分けるのに対して、YUVでは輝度(Y),青色差成分(U),赤色差成分(V)に分ける。
人間の目が輝度に敏感な性質を使ってUVを少ないビットで表現しても画質の劣化が少ない。
例えばNV12であればYを8bit、UVをそれぞれ2bitで1画素あたり12bitで表現できる。RGBで1画素あたり12bitを表現しようとすると各色4bitしか使うことができず非常に画質が劣化する。
なお、当初YUVが採用されたのは白黒テレビとカラーテレビの互換性を保つためだったらしい。[要出典]
4:4:4とか4:2:0ってなに?
これらはサンプリング方法を表している。(フォーマットとは違うので注意)
<輝度>:<水平方向色差>:<垂直方向色差>で表しているが言葉で説明するのは難しい。
下の図がわかりやすい。
サンプリングとフォーマットはどう違うのか。
サンプリングはあくまで画素からデータを取得する方法にすぎない。フォーマットはそれに加えて取得したデータをメモリやファイル上にどのように配置するかまでを規定するものとなる。
- 4:4:4 (32 bpp)
- AYUV
- 4:2:2 (16 bpp)
- YUY2
- UYVY
- 4:2:0 (16 bpp)
- IMC1
- IMC3
- 4:2:0 (12 bpp)
- IMC2
- IMC4
- YV12
- NV12
- YUV420
UYVY
例えばUYVYならメモリ上にYUVが以下のように並ぶ
NV12
NV12などはYとUVが別で配置されており、Yの領域とUVの領域は必ずしも連続している必要はない。それぞれのメモリ領域はプレーンと呼ばれており特に複数のプレーンからなるフォーマットはmulti-planarと呼ばれる。
YUV420
YUV420という紛らわしい名前が有るが、これはサンプリング方法ではなくフォーマット名。(サンプリング方法は4:2:0)
YUV420の中でさらに細かくI420,YV12…等に分かれる。
以下はI420のフォーマット。
いろんな4:2:0