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・・・ これは各企業が名前をそれぞれつけているので,命名規則などあったもんじゃ ないが,とにかく Packed formatPlaner 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を見ていると, たくさん 定義があるようやけど,どれが本当の変換式なんじゃ?どれがほんまの係数なん じゃ?

よく分からないことを列挙すると・・・

  1. そもそもデータの値の範囲はなんぼやねん
    • ITU-R BT.601 の規定は?
    • カメラからくるUYVY信号は?
  2. (色空間変換式)YUVとYCbCrはどこがちゃうねん.

どうも調べていると,定義式がようけあるのは

  1. TVなどの Composit Analog とITU-R 601規定で,色差のスケーリングが違う
    • テレビで用いるYUVは B-Y, R-Yをそれぞれ2.03, 1.14で割る
    • ITU-Rだとそれぞれ 1.772, 1.402で割る
    • スケーリングしない場合もある
  2. 各コンポーネントの値の範囲によって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の相互変換

データ範囲

コンポーネント下限上限備考
Y16235 この値を越えて [1:254]にデータが存在しても構わな いらしい
0と255は同期信号として利用
Cb/Cr16240無彩色(白,黒,灰色)が128
RGB0255 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の相互変換

データ範囲

コンポーネント下限上限備考
Y0255
U/V-128127 1394TA IIDC spec. 0から255にするには U,VをU-128,V-128に置き換える
RGB0255

変換式(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フォーマットに関して

変換式に関して

アナログコンポジット信号における輝度と色差

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