YUV↔RGBする際の、
- 「ストレート変換」
- 「YC伸長」
の違いについての自分用まとめです。
違い
この世にあるほとんどの動画の色空間は「YUV」ですが、パソコンモニタでこれを再生するには「RGB」に変換しないといけません。
その際に行われる変換の種類のことを
- 「ストレート変換」
- 「YC伸長」
と言います。
図で表すと以下の様な感じです。
▲ストレート変換 | ▲YC伸長 |
ストレート変換
YUVの色範囲は、
- Y:「16~235」
- UV「16-240」
ですが、RGBは「0~255」なので、YUVの値をそのままRGBで使うと色がおかしな事になります。
例えば、
- YUVで言う所の「15」は「黒色」ですが、RGBで言う所の「15」は、「微妙に薄い黒色」になります。
- YUVで言う所の「235」は「白色」ですが、RGBで言う所の「235」は、「微妙に灰色気味な白色」になります。
という感じです。
それを補正せずに、そのままRGBとして変換することを「ストレート変換」と言います。
※ちなみに0~255までの色範囲を持つYUVも存在します。(そんなYUVのことをフルレンジYUVと呼びます)
YC伸長
「ストレート変換」で説明した通り、範囲を補正してRGB変換することを「YC伸長」と呼びます。(ちなみに「YC」は、「Y」が輝度、「C」が色差のこと)
つまり、YUVな動画は「YC伸長」しないと、全体的に灰色掛かった色になってしまうということです。
変換すると色は劣化する
色変換する際に使われる公式は色々ありますが、
ここでは例としてアナログ放送で使われてたNTSCの色変換規格である「ITU-R BT.601」を例に考えてみます。
- R = Y + 1.402 × Cr
- G = Y – 0.344136 × Cb – 0.714136 × Cr
- B = Y + 1.772 × Cb
例えば以下の様な場合は色は劣化しませんが、(YUV=YCbCr)
YCbCr(100,22,90) → RGB(226,18,38)
以下の様な場合は0~255の範囲からはみ出してしまうので、色が劣化します。
YCbCr(80,22,128) → RGB(259,-20,38) → RGB(255,0,38)(切り捨て)
これはストレート変換の場合ですが、YC伸長した場合は、更に色情報が切り捨てられる事になります。
つまり、
- 動画編集の段階では、色変換は極力行うべきでない
- できる限り色空間は維持する
- 色変換は再生時に、再生ソフト・コーデック行わせる
- YUVな動画の場合は、「これはTVスケールの動画だ!」という風にコーデックとかが勝手に判断してくれてYC伸長してくれる(だからパソコンでテレビソースな動画を観ても色に違和感なくみれる)
という事が分かります。
AviUtlではどうなっているのか
AviUtlでYUVな動画を読み込んだ場合は、内部ではYUVとして処理し、プレビュー画面は「YC伸長」してRGBで表示されます。
RGBな動画を読み込んだ場合は、内部はRGBとして処理し、プレビュー画面もそのままRGBで表示されます。
変換しているのはどのソフト?ハード?
例えばYUV・RGBファイルを読み込んだ場合に、パソコンでRGB変換するには以下通りのパターンがあります。(赤字はRGB、青字はYUV)
- RGBファイル→コーデック→再生ソフト→OS→グラフィックボード→パソコンモニタ
- YUVファイル→コーデック→再生ソフト→OS→グラフィックボード→パソコンモニタ
- YUVファイル→コーデック→再生ソフト→OS→グラフィックボード→パソコンモニタ
- YUVファイル→コーデック→再生ソフト→OS→グラフィックボード→パソコンモニタ
- YUVファイル→コーデック→再生ソフト→OS→グラフィックボード→パソコンモニタ
これについては、パソコンのグラボ、再生ソフト、コーデック、OSによって違うので、一概にどのソフト・ハードで変換しているのか分かりません。
ffdshow(コーデック)だと、出力先がPCモニタなのか、テレビなのかで、ストレートかYC伸長かを選ぶ事ができたりもします。
▲ffdshowの設定画面
|
このページの情報は以上です。
関連:フルレンジとリミテッドレンジの違い【RGB・YUV】(内容的には同じ)
コメント