色空間

Last-modified: 2016-04-15 (金) 02:24:42

手っ取り早いページ

色空間:正しいRGB-YUV色変換

基礎知識

色空間とは

色空間(Colour space, Color space)とは、主に人間が知覚できる色を「空間」にマッピングして表現したもので、3次元空間、あるいは2次元空間で表します。色空間は、様々な研究によって定義され、CIE(国際照明委員会)やAdobe社などが決めた色空間が有名です。

原色とは

色空間は、3つまたは4つの原色(Primary colors, Primary colours, primary)を組み合わせて、表現します。原色は、「チャンネル」や「コンポーネント」と呼ぶこともあります。

RGB色空間

パソコンで色を扱うときに最もポピュラーな色空間で、「光の三原色」といえば、聞いたことがある方も多いかと思います。色を「赤い光」と「緑の光」と「青い光」を混ぜることによって表現します。いわゆる加法混合の1つです。

式:色=(赤の明るさ×赤)+(緑の明るさ×緑)+(青の明るさ×青)

コンピューターでの符号化方式

コンピューターでは R, G, B の各原色を一定のビット長で表します。
有名なものは、すべての原色を 8 ビットで表し、1ピクセルを 24 ビットで表します。よく「R8G8B8」とか「RGB888」などと呼ぶことがあります。

01234
1RGBRGBRGBRGB
2RGBRGBRGBRGB
3RGBRGBRGBRGB
4RGBRGBRGBRGB

High Color - ハイカラー - 16bit Color

赤、青を32階調、緑を64階調の明るさで扱います。この組み合わせで表現出来る色数は6万5536色となります。
緑の階調が多いのは、人間の目と脳の仕組みは、緑の変化に敏感であるからです。
なお、32は2の5乗で、64は2の6乗です。合わせて16乗ですので、ハイカラーの色は16ビットあれば表現出来ることになります。

True Color - トゥルーカラー - 24bit Color - 32bit Color

赤、緑、青を256階調の明るさで扱います。この組み合わせで表現出来る色数は、1677万7216色となります。
なお、256は2の8乗です。合わせて24乗ですので、トゥルーカラーの色は24ビットあれば表現出来ることになります。
また、赤、緑、青の他に透過度合いを256階調持たせることで、42億9496万7296色を持たせることもあります。
(パソコンでは、24bitよりも32bitなど、2のn乗データの方が扱いやすいので、内部では24bitより32bitで扱うことが多いです。)

Deep Color - ディープカラー - 30bit Color

赤、緑、青を1024階調の明るさで扱います。この組み合わせで表現出来る色数は、10億7374万1824色となります。
なお、1024は2の10乗です。合わせて30乗ですので、トゥルーカラーの色は30ビットあれば表現出来ることになります。

余談「コンポーネントとコンポジット」

これらの赤、緑、青の各色成分をテレビなどの映像機器へ伝送する際に、別々の信号として扱うものを「コンポーネント・ビデオ」、1つの信号として扱うものを「コンポジット・ビデオ」といいます。
コンポーネントは、英語「component」で、意味は「成分」です。
コンポジットは、英語「composite」で、意味は「合成物」となります。

YCbCr色空間

最も身近な色空間の1つです。テレビなどの機器で用いられています。YPbPrとも言います。YIQは別物。YUVも一応、別物。

式:色=明るさ+青の濃さ+赤の濃さ

この形式が良いのは、RGB色空間に比べて、人間が色を認識する仕組みに近いことです。
人間の目は、明るさに敏感で、色に関しては鈍感です。明るさは毎日一周しますが、色味は1年かけて変わるから、なんて理由かもしれません。
また、ほ乳類の多くは色を識別できませんので、より高次の能力なので発達段階だというだけのことかもしれません。
つまり、色成分を減らしても、あまり人間には違いがわかりません。
テレビ放送などでは、映像を送る為にデータをなるべく減らしたいという思いがあります。
ここで、この人間の特性を使用し、色成分を削るわけです。これは、RGB色空間では出来ない芸当です。
あと、YCbCrになっている理由は、白黒テレビからカラーテレビになるときに、互換性のためにも良かったのです。カラーテレビになる際に、白黒信号つまり輝度信号に色差信号を加えるだけで良かったためです。

YCbCr 4:4:4

Y(明るさ)とCb(青の濃さ)、Cr(赤の濃さ)の各成分を256階調(8ビット)で表します。
Y(明るさ)=4に対して、色成分が水平方向も垂直方向も4のデータ量、つまり同じ階調(密度)で表現できる状態です。
よって、1画素あたり24ビットのデータ量となります。

0123412341234
1YYYYCbCbCbCbCrCrCrCr
2YYYYCbCbCbCbCrCrCrCr
3YYYYCbCbCbCbCrCrCrCr
4YYYYCbCbCbCbCrCrCrCr

YCbCr 4:2:2

Y(明るさ)とCb(青の濃さ)、Cr(赤の濃さ)の各成分を256階調(8ビット)で表します。
ただし、色差成分(Cb、Cr)に関しては、水平方向4画素につき2成分しか記録しません。
つまり、4画素でY=32bits、Cb=16bits、Cr=16bits、合計で64ビットですので、1画素平均16ビットのデータ量となります。
例えば、1920x1080の画像があった場合、Y(明るさ)は、1920x1080個記録します。
一方、Cb、Cr成分は、2画素に対して256階調(8ビット)で記録しますので、960x1080個の色成分を記憶します。
つまり水平方向に隣り合う画素は同じCb、Crとなります。

0123412341234
1YYYYCbCbCrCr
2YYYYCbCbCrCr
3YYYYCbCbCrCr
4YYYYCbCbCrCr

なお、上記イメージはメモリ上の配置とは関係ありません。
メモリ上は、1ピクセルを構成するY成分、Cb成分、Cr成分のデータを連続して配置することもありますし、先にY成分を構成する「プレーン」を先に配置して、次にCb成分のプレーン、Cr成分のプレーンを配置することもあります。
このようなメモリ配置については、また別途説明します。

YCbCr 4:1:1

Y(明るさ)とCb(青の濃さ)、Cr(赤の濃さ)の各成分を256階調(8ビット)で表します。
ただし、色差成分(Cb、Cr)に関しては、水平方向4画素につき1成分しか記録しません。
つまり、4画素でY=32bits、Cb=8bits、Cr=8bits、合計で48ビットですので、1画素平均12ビットのデータ量となります。
例えば、1920x1080の画像があった場合、Y(明るさ)は、1920x1080個記録します。
一方、Cb、Cr成分は、4画素に対して256階調(8ビット)で記録しますので、480x1080個の色成分を記憶します。
つまり水平方向に隣り合う画素は同じCb、Crとなります。

0123412341234
1YYYYCbCr
2YYYYCbCr
3YYYYCbCr
4YYYYCbCr

YCbCr 4:2:0、YCbCr 4:0:2

Y(明るさ)とCb(青の濃さ)、Cr(赤の濃さ)の各成分を256階調(8ビット)で表します。
ただし、色差成分(Cb、Cr)に関しては、水平方向4画素につき2成分、垂直方向も4画素につき2成分しか記録しません。
つまり、4画素でY=32bits、Cb=8bits、Cr=8bits、合計で48ビットですので、1画素平均12ビットのデータ量となります。
例えば、1920x1080の画像があった場合、Y(明るさ)は、1920x1080個記録します。
一方、Cb、Cr成分は、2画素に対して256階調(8ビット)で記録しますので、960x540個の色成分を記憶します。
つまり水平方向および垂直方向に隣り合う画素は同じCb、Crとなります。

0123412341234
1YYYYCbCbCrCr
2YYYY
3YYYYCbCbCrCr
4YYYY

RGB-YCbCr変換

変換には幾つかの方式があります。

ITU-T R.BT601

昔は、CCIR 601。規格書は、下記からダウンロード可能です。

RGBから、YCbCrを求める場合。

Y = 0.299 * R + 0.587 * G + 0.114 * B
Cb = 0.564 * (B-Y)
Cr = 0.713 * (R-Y)

YCbCrからRGBを求める場合は、上式より下記が導ける。

R = Y + Cr / 0.713
G = (Y - 0.299 * R - 0.114 * b) / 0.587
B = Y + Cb / 0.564

ITU-T R.BT709

昔は、CCIR 709。規格書は、下記からダウンロード可能です。

RGBから、YCbCrを求める場合。

Y = 0.2126 * R + 0.7152 * G + 0.0722 * B
Cb = 0.5389 * (B - Y)
Cr = 0.6350 * (R - Y)

YCbCrからRGBを求める場合。

R = Y + Cr / 0.6350
G = (Y - 0.2126 * R - 0.0722 * b) / 0.7152
B = Y + Cb / 0.5389

ITU-R BT.2020

規格書は、下記からダウンロード可能です。

YUVの歴史

NTSCは、0 ~100 IREで輝度を表現。100IREで0.714V。
これを601色空間では16 ~219 で表現。リミテッドレンジとも、601ルミナンスレンジとも呼ぶ。
逆に0 ~ 255 の範囲は、フルレンジあるいはPCルミナンスレンジと呼ぶ。
100IREで表される白は、リーガルホワイトと呼ばれ、100IREを超える白はスーパーホワイト、イリーガルホワイトと呼ばれていた。

DV, DTV

Apple DV Codecは、スーパーホワイトを使用するので、白クリップ問題が出る。

http://www.macdtv.com/InfoCenter/Labo/Color/02_history.html

補足

さて、このITU-R BT.601 や ITU-R BT.709で色変換を行ってみるとわかるが、
コンピュータの仕組み上、必ず誤差が出てしまう。(もちろん誤差無く計算も可能だが、速度が犠牲になる)
そこで最近では、ソニーのテレビなどには「xvYCC」(IEC61966-2-4)という新しい色空間を提供している。
この「xvYCC」には、xvYCC601とxvYCC709が存在し、それぞれ、ITU-R BT.601、ITU-R BT.709の拡張規格となっている。

YCoCg

これも、YCbCrと同じ仕組みです。

式:色=明るさ+オレンジの濃さ+緑の濃さ

RGB-YCoCg変換

RGBから、YCoCgを求める場合。

Co = R - B
t = B + (Co >> 1)
Cg = G - t
Y = t + (Cg >> 1)

YCoCgからRGBを求める場合。

t = Y - (Cg >> 1)
G = Cg + t
B = t - (Co >> 1)
R = Co + B;

補足

上記変換式では、小数計算における誤差は含まない。
また、実際にRGB24bitカラーの全色について確かめてみるとわかるが、RGB→YCoCg→RGBと変換しても誤差は一切ない。

言葉の定義

色域, gamut
色空間, colour space
色差, chroma
人間の目が「赤と緑の違い」を認識する機能と、「青と黄の違い」を認識する機能、2つの機能について着目して表現したもの。

参考