はじめに
YUV,YUVとよく耳にするが,いったいどれだけフォーマットがあんねん!
YUVとRGBの変換式をよく目にするが,いったいどれだけ定義があんねん!
どうもwebで調べていると,デジタルもアナログも,YUV,YCbCr,YIQの変換式も すべて混沌としていて,どれが正しいのか見当がつかない.筋が通っ ていると思われるものを書きつくってみる.
YUVとは
「人間の目は明るさの変化には敏感だが, 色の変化に は鈍感である」 というわけで,色度を抑え、輝度により広い帯域やビット数を 割くことにより、少ない損失で効率の良い伝送や圧縮を実現するフォーマット.
デジタル画像の圧縮CODECにおけるフォーマット という観点でまとめる.
Y | 輝度信号 | CIE の色度図のY軸だから |
---|---|---|
U (B-Y) | 色差信号(Cb) | |
V (R-Y) | 色差信号(Cr) |
輝度と色差のサンプル比に基づく呼び方
サブサンプリングする際の, 輝度と色差信号のサンプル比に注目して,次のような呼び方がある. YUV444,YUV422,YUV411,YUV12,YUV9,YUV420,YUV410など.
命名規則 | 間引き方 | 圧縮率 (8bit量子化の際の実効ビット(per pixel)) | ||||
---|---|---|---|---|---|---|
1 (24bit) | 2/3 (16bit) | 1/2 (12bit) | 3/8 (9bit) | |||
YUV yuv |
y:u:vがサンプリングの比 (原画像4pixelに対する比) |
水平方向で間引く(packed参照) | YUV444 | YUV422(YUV211) | YUV411 | |
YUV x |
x が8bitで量子化したときの1pixelあたりのデー
タ量 (x = (y*8 + u*8 + v*8)/y ) |
YUV12 | YUV9 | |||
YUV yc0 |
y=4のみ.c=2 なら,2x2ブロック(4pixel)でu/vがそれぞれ1サンプルずつ. c=1 なら,4x4ブロック(16pixel)でu/vがそれぞれ1サンプルずつ. |
ブロックで間引く(planer参照) | YUV420 | YUV410 |
YUV411なら,水平方向の4pixelに対して輝度は4pixel全て取るが,色差は1pixel
ずつだけ取る.
YUV12とYUV420,YUV9とYUV410は同じものらしい.
YUV420のゼロってなんやねん?これはどうも2x2ブロック のように垂直方向も考えて.はじめのラインで輝度2pixel に対 して 「V」(または「U」)を1pixel取り,次のラインでは輝度2pixelに対して「V」 (または「U」) を1pixel 取るということのようだ.
YUVのフォーマット(FOURCC)
FOURCC・・・ これは各企業が名前をそれぞれつけているので,命名規則などあったもんじゃ ないが,とにかく Packed format と Planer format がある.これらは,色差の間引き方と,データ格納 の仕方が違うようだ.前者は,水平方向(各ライン)での間引き方を考え,「Y」 「U」「V」 を単一配列に格納するフォーマットである.一方,後者はn x n のブロックで の間引き方を考え,「Y」「U」「V」をそれぞれ異なる配列(プレーン,平面)に 格納する.いいかえると,各色差は垂直方向にはnライン飛びに,水平方向にはn サンプル飛びにサンプリングする. U,V平面はY平面の1/n^2 になる.
基本的にFOURCCは,格納された「Y」「U」「V」の並び方を意味し,数字は 1pixelあたりの実効bit数を意味するようだ.(YUY2は違うけど)
Packed format
マクロピクセルでのパックの仕方によって次のように名前が変わる (DVでよく使いそうなものだけ列挙).はじめの3つは順番が違うだけで,全てYUV422. 1マクロピクセル(u_int32)の中に画像の2ピクセルが入る.
これら(UYVY, YUY2, YVYU)は MSYUV CODEC でサポートされ,AVI Decorder Filter (DirectShow) 等によってRGB16, RGB8 に変換される.
フォーマット名(FOURCC) | サンプル比 | 実効ビット(per pixel) | マクロピクセルでのパックの仕方 | 備考 |
---|---|---|---|---|
UYVY (UYNV) | YUV422 | 16bit | U0, Y0, V0, Y1 | よく使われる |
YUY2 (YUNV, V422) | Y0, U0, Y1, V0 | |||
YVYU | Y0, V0, Y1, U0 | |||
IYU1 | YUV411 | 12bit | U0, Y0, Y1, V0, Y3, Y4 | IEEE1394 Digital Camera 1.04 Specification |
IYU2 | YUV444 | 24bit | U0, Y0, V0, U1, Y1, V1 | IEEE1394 Digital Camera 1.04 Specification |
Planer format
フォーマット名(FOURCC) | サンプル比による呼び方 | 実効ビット(per pixel) | プレーン(配列)の順 | 備考 |
---|---|---|---|---|
YV12 | YUV420,YUV12 (2x2) | 12bit | Y, V, U | MPEG-1でおなじみ |
IYUV, I420 | YUV420 (2x2) | 12bit | Y, U, V | YV12と U,Vプレーンの順序が違うだけ |
YVU9 | YUV410,YUV9 (4x4) | 9bit | Y, V, U |
YUV <-> RGB 変換式
webを見ていると, たくさん 定義があるようやけど,どれが本当の変換式なんじゃ?どれがほんまの係数なん じゃ?
よく分からないことを列挙すると・・・
- そもそもデータの値の範囲はなんぼやねん
- ITU-R BT.601 の規定は?
- カメラからくるUYVY信号は?
- (色空間変換式)YUVとYCbCrはどこがちゃうねん.
どうも調べていると,定義式がようけあるのは
- TVなどの Composit Analog とITU-R 601規定で,色差のスケーリングが違う
- テレビで用いるYUVは B-Y, R-Yをそれぞれ2.03, 1.14で割る
- ITU-Rだとそれぞれ 1.772, 1.402で割る
- スケーリングしない場合もある
- 各コンポーネントの値の範囲によってYUV,RGBそれぞれ
2種類の色空間が良く用いられる(8bit量子化の例)
- full-range RGB [0,255]
- compressed-range RGB [16,235]
- full-range YUV [0,255]
- compressed-range YUV [16,235/240]
などの理由からのようやな.
要はどの色空間でのYUV, RGBか(B-Y,R-Y のスケーリングや値の範囲など)を見極めて それに合 う変換式を使えということなんやろう. とりあえず変数を用いた 一般的な変換式を導いてみよう. その後,いくつかの場合について,具体的な変換式を出してみよう.
一般の場合を考えてみよう
とりあえず,こんな感じなんやろ(か?).
変換式(係数)算出用 Excel
元LaTeXファイル
ITU-R BT.601 規定YCbCrと8bitフルスケールRGBの相互変換
データ範囲
コンポーネント | 下限 | 上限 | 備考 |
---|---|---|---|
Y | 16 | 235 | この値を越えて [1:254]にデータが存在しても構わな
いらしい 0と255は同期信号として利用 |
Cb/Cr | 16 | 240 | 無彩色(白,黒,灰色)が128 |
RGB | 0 | 255 | ITU-Rでは16から235に量子化するように規定されているらしい(?)がここでは8bitフルスケールとする |
変換式(1)
先に述べた一般の場合の変換式で, r'=0.299, g'=0.587, b'=0.114, x = 1.772, y = 1.402, α = 219, β = 16, γ = 224, δ = 128, n = 255とする.
RGB to YCbCr
Y = 0.257R + 0.504G + 0.098B + 16 Cb = -0.148R - 0.291G + 0.439B + 128 Cr = 0.439R - 0.368G - 0.071B + 128 |
YCbCr to RGB
R = 1.164(Y-16) + 1.596(Cr-128) G = 1.164(Y-16) - 0.391(Cb-128) - 0.813(Cr-128) B = 1.164(Y-16) + 2.018(Cb-128) |
ところで,IIDC 1394-based Digital Camera Spec.1.30 を見る限りでは YUVそれぞれ のコンポーネントを8bitフルでとっている(Y(Mono16)は考えない)・・・ここか らRGB8にするには以下のようになる.
8bitフルスケールYUVと8bitフルスケールRGBの相互変換
データ範囲
コンポーネント | 下限 | 上限 | 備考 |
---|---|---|---|
Y | 0 | 255 | |
U/V | -128 | 127 | 1394TA IIDC spec. 0から255にするには U,VをU-128,V-128に置き換える |
RGB | 0 | 255 |
変換式(2)
先に述べた一般の場合の変換式で, r'=0.299, g'=0.587, b'=0.114, x = 1.772, y = 1.402, α = 255, β = 0, γ = 255, δ = 0, n = 255とする.
RGB to YUV
Y = 0.299R + 0.587G + 0.114B U = -0.169R - 0.331G + 0.500B V = 0.500R - 0.419G - 0.081B |
YUV to RGB
R = 1.000Y + 1.402V G = 1.000Y - 0.344U - 0.714V B = 1.000Y + 1.772U |
で,結局 DFW-VL500ではどのような変換式を用いればええの?
この辺りは説明書を見るしかないだろう.
DFW-VL500の説明書(英語)によれば,このカメラの出力はB-Y, R-Yのスケーリングはしていないよ
うだ.したがって,変換式は以下のようになる.この場合,R, G, Bのスケー
ルを1.0とすれば,B-Y, R-Y の範囲は1.0を超える(それぞれ,0.89*2, 0.70*2
になる).したがって,Yが[0,255], B-Y, R-Y が[-128,127]の範囲の値をとるならば,例えば (R,G,B) = (255,0,0) に変換されるような信号は出てこないことになる.
変換式(3)
先に述べた一般の場合の変換式で, r'=0.300, g'=0.570, b'=0.110, x = y = 1.0, α = 255, β = 0, γ = 255, δ = 0, n = 255 とする. なお,以下の式の有効数字はDFWの説明書と異なるので注意.B-Y, R-Yは [-128,127]を仮定しているため,[0,255]の場合は適宜バイアスを加える必要あ り.
RGB to Y,B-Y,R-Y
Y = 0.300R + 0.590G + 0.110B B-Y = -0.300R - 0.590G + 0.890B R-Y = 0.700R - 0.590G - 0.110B |
Y,B-Y,R-Y to RGB
R = 1.000Y + 1.000(R-Y) G = 1.000Y - 0.186(B-Y) - 0.508(R-Y) B = 1.000Y + 1.000(B-Y) |
参考にしたリンク
YUVフォーマットに関して
- 鈴木直美の「PC Watch先週のキーワード」 YUVフォーマットに関して(日本語)簡単な解説程度
- YUV Formats (変換式についても記述あり) YUVフォーマットに関して(英語)非常に詳しい
- YUVフォーマットに関して(DirectX の日本語へルプ)
pathはインストール先
に変える必要あり
日本語へルプは http://www.microsoft.com/japan/developer/directx/downloads.aspよりダ ウンロード可能
変換式に関して
- SGIのDigital Media Programming Guide
第2章 Digital Media Essentials
(ウェブ全体を対象にして "Digital Media Essentials"などで検索)
量子化の際のマップの仕方によってRGB,YUVそれぞれ2種類の色空間を定義 している.
また,YUV,YCrCbの違いについても述べている(英語)非常 に詳しい - ITU-R BT.601 について 詳しい(日本語)
- YUV Lab Reports 詳しい(英語) UYVY, YUY2, YV-12からRGBへのデモプログラムあり
- huffyuv 変換プログラム作成時の参考に・・・(英語)
- LCL vfw(Video for Windows)用のLoss-Less Codec Library(日本語)
- 色空間与太話
- カラーフォーマットのナゾ 分かりやすい
- (デジタル/アナログ)ビデオの用語集(英語)
アナログコンポジット信号における輝度と色差
NTSC | American(Japanese) standard | YIQ |
---|---|---|
PAL | European standard | YUV |
SECAM | French(ロシアや東欧) standard |
IEEE 1394-based Digital Camera におけるモード
Mode 0 | 160x120(4:4:4) |
160x120x24=460,800 bpf 15fps: 6,912kbps, 30fps: 13,824kbps |
---|---|---|
Mode 1 | 320x240(4:2:2) |
320x240x16=1,228,800 bpf
15fps: 18,432kbps, 30fps: 36,864kbps |
Mode 2 | 640x480(4:1:1) |
640x480x12=3,686,400 bpf
15fps: 55,296kbps, 30fps: 110,592kbps |
Mode 3 | 640x480(4:2:2) |
640x480x16=4,915,200 bpf
15fps: 73,728kbps, 30fps: 147,456kbps |