x.v.colorとは結局どういうものなのか?


色空間規格のsRGBやBT.709やadobe RGBなどは色域がきちんと定義されているので、それに対応したディスプレイがどのくらいの色再現範囲を持っているのかが分かりやすい。が、x.v.Color(xvYCC)対応ディスプレイというのは色域が明確に示されていないものが多い。x.v.color=広色域というイメージはあるが、実際どのくらい広色域なのかは、よく分からない。x.v.color対応のテレビやPCモニタがどのくらいの色再現範囲を持っているのかは、そのテレビやモニタの性能しだいだったりする。
x.v.colorは普通の色空間(sRGBとか)の規格とは定義のされ方がちょっと違うためにそういうややこしいことが起こる。ややこしいのでちょっと整理してみる。

色域の持つ意味

x.v.colorについての前に、BT.709やsRGBといった色空間規格の色域の定義がどういう意味を持つのかについてを説明しておく。

動画でも静止画でも、デジタル画像の色は赤(R)、緑(G)、青(B)の3色の明るさの数値(階調レベルといったりする)で表現されている。ペイントソフトなどで色を指定するときに使う赤、緑、青の3つの数値がそれで、たいてい0〜255の整数値で表される。デジカメ写真でもデジタル放送の映像でも基本的に同じ。
ただ、それだけでは「数値」と「実際の色」との対応関係が決まらない。たとえば「赤」を先ほどの数値で表現するとRGBがそれぞれ(255,0,0)という数値になるが、それをディスプレイに表示するときにどんな赤で表示すればいいのかが決まらない。赤といっても朱色っぽいものや紅色っぽいものまでいろいろなので、数値で(255,0,0)と指定されている赤が、どの赤のことを言っているのかが分からない。逆に写真を撮る場合でも、たとえば「郵便ポストの赤」は数値だとどの値にすればいいのかが決まらない。(255,0,0)にすればいいのか、(255,10,0)なのか、(255,0,10)なのかといった判断をするための指標がないためだ。
こういったことを解決するには、「RGBの数値」と「実際の色」との対応関係を定義しておく必要がある。そこで決められているのが色空間規格の色域である。これにより、たとえば(255,0,0)が実際にはどんな色なのかが一意に決められている。具体的にどんな色かは色空間によって違うが、例えばsRGB(BT.709も同じ)だと、(255,0,0)はCIE表色系でx,yがそれぞれ(0.64,0.33)という具合に決められている。ちなみにCIE表色系というのは実世界の色を数値で表す方法のひとつ。
つまり、色空間規格の色域の意味とは、「実世界の色(を数値で表したもの)」と「デジタル画像上で色を表現する数値」との対応関係を一意に定義するもの、といえる。色空間が指定されることで、デジタル画像上の数値と実世界の色とが1対1に対応するようになっているのである。

ところで、実世界の色を数値化した値を、デジタル画像上で色を表すときにもそのまま使えば、色空間の定義なんていうややこしいものは必要ないと思うのだが、そういうふうにはなっていない。デジタル信号処理の都合上、色を0〜255までの数値で表現した方が便利だからだろうと思う。

色空間の定義の方法

色空間規格の色域は、RGBの三原色の色度と白の色度で定義される。色度というのは、実世界の色を数値化した値のこと。色度の具体例はこちらを参照。白を定義するのは、赤、緑、青のそれぞれの最大の明るさ(輝度)の比を定義しておくため。
で、色空間で決められているRGB三原色の色度座標をxy色度図上にプロットしてできる三角形が、その色空間の色域を表す。たとえばこんな感じ。このリンク先の図ではsRGBの色域を示す三角形が描かれている。この三角形の内側にある色がその色空間で扱える色になる。この三角形が大きいほど「色域が広い」と言われ、より鮮やかな色を扱える。逆に言うと、この三角形の外側にある色はその色空間では扱うことができず、「0〜255の値」で表現できない。

※ちなみにxy色度図というのは、実世界の色をすべて数値化して、2次元グラフ上にプロットした図のこと。
※本当は、RGBと白の色度座標だけでなく「ガンマ」も定義されるが、ガンマについて説明すると余計にややこしくなるので今回は省略。

「実世界の色(を数値で表したもの)」と「デジタル画像上で色を表現する数値」の変換方法

例として、sRGB(BT.709でも同じ)でのRGB値(デジタル画像上で色を示す数値)と、CIE表色系のxy値(実世界での色を示す数値)との変換式を示す。

 X = 0.4124*R + 0.3576*G + 0.1805*B
 Y = 0.2126*R + 0.7152*G + 0.0722*B
 Z = 0.0193*R + 0.1192*G + 0.9505*B
 x = X/(X+Y+Z)
 y = Y/(X+Y+Z)
A Standard Default Color Space for the Internet - sRGBより

この計算は、RGBの0〜255を0〜1の実数値に換算してから行う。デジタル画像上で(R,G,B)=(255,0,0)という値の場合、これを(1,0,0)と換算して、上記の式に代入すると、x=0.64,y=0.33 という実世界での色の値が得られる。
上の式はsRGBの場合の式だが、他の色空間の場合でも係数が変わるだけで基本的に同じである。
※本当はこの計算式にも「ガンマ」が関係してきて、それも考慮しないといけないのだけれど、ややこしくなるから省略。上の式はRGBがリニアの場合の式。RGBがリニアじゃないときはリニアに変換してから上の式に代入する。

x.v.colorの定義

やっと本題。x.v.color(xvYCCと同義)の定義について。
そもそもなんでx.v.colorなんていうものが出てきたかというと、今までの色空間(BT.709)では扱えない(=xy色度図上でBT.709の色域を示す三角形の外側にある)色をどうにかして扱えるようにしたい、という思いを実現させるため。最近のディスプレイには、技術の進歩によりBT.709の色域を超える色再現範囲を持つものがある。それだけの実力があるのに、BT.709の範囲内の色しか扱えないのではもったいないから、もっと広い色域の色を扱えるように定義しなおそう、ということだ。
では、どうやってBT.709の色域の外の色を表すか。いちばん分かりやすいのは、RGB三原色の色度の定義を変更して、BT.709の外側に三原色が来るようにすること。ところが、諸々の事情からx.v.colorのRGB三原色の定義はBT.709と同じになっている。
じゃあ、どうやってBT.709の外の色を扱うのか? これは、三原色の定義は変えないかわりに、RGBの数値のとる範囲の方を広くする、という方法で実現している。具体的には、先ほどデジタル画像ではR、G、Bの明るさを0〜255で表すと説明したが、これを0以下のマイナスの値と255より大きい値も使っていいですよ、というように定義している。
なんでそれで色域が広がるのか?マイナスや255以上の値ってどういう意味だ?となって非常にややこしいが、「実世界の色(を数値で表したもの)」と「デジタル画像上で色を表現する数値」の変換を行う計算式で実際に計算してみると、確かに色域が広がっている。数学的な話なのでイメージしにくいが、ようは「計算上そうなる」というだけの話である。実際に先ほどの計算式に、(R,G,B) = (1.2, -0.1, 0) という値を代入すると、(x,y) = (0.7, 0.28) となり、ちゃんとBT.709の外側の値になる。イメージとしてはマイナスの値とか255以上の値と言われてもまったく意味が分からないが、とにかくそうすることでBT.709の外側の色も扱えるようになるのである。

では、マイナスや255以上の値をとってもいいのなら無限に広くとってもいいのか?というとそういうわけでもない。またややこしい話だが、ここでYUVという形式の色空間が登場する。YUVとは、YCbCrとも言われたりするが、ようはRGBの値を変換して、輝度成分と色成分に分けたものである。RGBはそれぞれ赤緑青の成分の明るさに対応するが、YUVはYが明るさ(輝度)成分、UとVが色成分に対応する。YUVもRGB同様「デジタル画像上で色を表現する数値」である。RGB値とYUV値は1対1に対応する。
YUV形式は、jpeg画像やmpeg動画などで使われている。つまり、デジカメの画像やデジタル放送の映像はYUV方式で記録されている。YUVとRGBの変換式は以下のようになる。(BT.709の色域の場合)

 Y = 0.2125*R + 0.7154*G + 0.0721*B 
 U = -0.115*R - 0.386*G + 0.500*B 
 V = 0.500*R - 0.454*G - 0.046*B 
まるも製作所より

これもRGBの値は0〜255を0〜1の整数値に変換したものを使う。(本当は0〜255ではなくて16〜235だったりもするのだが、ややこしくなるのでそこは深く考えずに置いとく。)
で、これがx.v.colorと何の関係があるかというと、RGBとYUVを相互に変換したときの値の範囲が関係してくる。実際にいろいろな値を入れて計算してみると分かるが、RGBでは0〜1のフルレンジを使っても、それをYUVに変換すると0〜1のフルレンジではなくなる。つまり、RGBのとる値の範囲はYUVのとる値の範囲より狭いので、YUV形式には使われていない領域が存在する、ということ。そういう「RGBからYUVへの変換で使われてない領域」も使っていいことにしましょう、というように決めたのがx.v.colorなのである。ここなどにYUVとRGBの値の範囲を表す図があるので参照のこと。

使ってなかった領域のYUV値は、上記の変換式の逆でYUVからRGBへの変換を行うと、RGBの値がマイナスの値や1以上の値をとる。で、そういうマイナスや1以上の値で表される色はBT.709の外側の色である。つまり、x.v.colorでどのくらい色域が広がるのか、というのは結局「今まで使ってなかったYUV値の範囲の分」だけ広がっている、ということになる。



長くなったのでこの辺でいったん終了。続きはまた後日