YUVフォーマット及び YUV<->RGB変換
はじめに
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は,格納された「Y」「U」「V」の並び方を意味し,数字は1pixelあたりの実効bit数を意味するようだ.(YUY2は違うけど) マクロピクセルでのパックの仕方によって次のように名前が変わる(DVでよく使いそうなものだけ列挙).はじめの3つは順番が違うだけで,全てYUV422.1マクロピクセル(u_int32)の中に画像の2ピクセルが入る. これら(UYVY, YUY2, YVYU)は MSYUV CODEC でサポートされ,AVIDecorder Filter (DirectShow) 等によってRGB16, RGB8に変換される. webを見ていると,たくさん定義があるようやけど,どれが本当の変換式なんじゃ?どれがほんまの係数なんじゃ? よく分からないことを列挙すると・・・ どうも調べていると,定義式がようけあるのは などの理由からのようやな. 要はどの色空間でのYUV, RGBか(B-Y,R-Yのスケーリングや値の範囲など)を見極めて それに合う変換式を使えということなんやろう.とりあえず変数を用いた一般的な変換式を導いてみよう.その後,いくつかの場合について,具体的な変換式を出してみよう. とりあえず,こんな感じなんやろ(か?). 先に述べた一般の場合の変換式で,r'=0.299, g'=0.587, b'=0.114, x= 1.772, y = 1.402, α = 219, β = 16, γ = 224, δ = 128, n = 255とする. ところで,IIDC 1394-based Digital Camera Spec.1.30 を見る限りでは YUVそれぞれのコンポーネントを8bitフルでとっている(Y(Mono16)は考えない)・・・ここからRGB8にするには以下のようになる. 先に述べた一般の場合の変換式で,r'=0.299, g'=0.587, b'=0.114, x= 1.772, y = 1.402, α = 255, β = 0, γ = 255, δ = 0, n = 255とする. この辺りは説明書を見るしかないだろう. 先に述べた一般の場合の変換式で,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]の場合は適宜バイアスを加える必要あり.Packed format
フォーマット名(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 変換式
一般の場合を考えてみよう
変換式(係数)算出用 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)
RGB to YCbCr Y = 0.257R + 0.504G + 0.098B + 16Cb = -0.148R - 0.291G + 0.439B + 128Cr = 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)
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)
RGB to YUV Y = 0.299R + 0.587G + 0.114BU = -0.169R - 0.331G + 0.500BV = 0.500R - 0.419G - 0.081B
YUV to RGB R = 1.000Y + 1.402VG = 1.000Y - 0.344U - 0.714VB = 1.000Y + 1.772U
で,結局 DFW-VL500ではどのような変換式を用いればええの?
変換式(3)
RGB to Y,B-Y,R-Y Y = 0.300R + 0.590G + 0.110BB-Y = -0.300R - 0.590G + 0.890BR-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フォーマットに関して
日本語へルプは http://www.microsoft.com/japan/developer/directx/downloads.aspよりダウンロード可能変換式に関して
(ウェブ全体を対象にして "Digital Media Essentials"などで検索)
量子化の際のマップの仕方によってRGB,YUVそれぞれ2種類の色空間を定義 している.
また,YUV,YCrCbの違いについても述べている(英語)非常 に詳しいアナログコンポジット信号における輝度と色差
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