2. カラー画像と色空間#

前節「デジタル画像」では、写真の各画素が赤、緑、青の三成分によって表されている、と述べた。しかし、色の表現方法には、応用的な目的に応じて様々な方法が存在する。

本節では、人間視覚による色知覚についての考え方について述べた後、カラー画像をデジタル画像として表現・取得する方法について紹介する。一連の内容を理解することで、データとしての画像には何が保存されているのか、そして、ディスプレイに表示された画像データが何を表しているのかについて理解を深めてほしい。

クイズ1

2026年現在、日本の特許の申請に使える画像はモノクロやグレースケールの画像が中心である (カラー画像が使えるのは意匠や商標などの一部の書類に限られる)。この背景には、画像データの観点から見て、どのような理由が考えられるだろうか?

クイズ2

2010年頃、シャープ社が赤、緑、青の他に黄色を加えた4色を基本色として用いる液晶テレビを発売した。通常のディスプレイでは、赤、緑、青の三原色を用いることが一般的であるが、黄色を加えることにはどのような利点があるのだろうか?

補足: 光の色の観点では、緑の光と赤の光を混色すると黄色を作ることができる。

参考資料

  • 『ディジタル画像処理 改訂第二版』 P.50 第3章 画像の性質と色空間

2.1. 色の知覚#

デジタル画像における画素の色が赤、緑、青の3色を基本として表されているのは、人間の視細胞が強く反応する光の波長に関係がある。

人間の視細胞には桿体細胞 (rod cell)と 錐体細胞 (cone cell) がある。桿体細胞は光の強さを知覚する役割を持ち、錐体細胞は色を知覚する役割を持つ。このうち錐体細胞には反応する色の異なる三つの細胞があり、反応する波長の長さからL錐体、M錐体、S錐体のように呼ばれる。また、可視光の中で長波長領域は赤色、中間の波長領域は緑色、短波長領域は青色に対応することから、L, M, Sの各錐体細胞は赤錐体、緑錐体、青錐体と呼ばれることもある。

このような人間の視覚の性質に合わせて、赤、緑、青の三色で定義される色空間をRGB色空間と呼ぶ。なお、各波長の光に対するL, M, Sの各錐体細胞の反応の強さは 図 2.1 のようになっている。

../_images/fc5a9b3a89475e129a1893a169f1fc81fdb5133a70195407660de8edea3b536a.png

図 2.1 L, M, S錐体の各波長の光に対する反応強度#

なお、ヒトは三種の色覚細胞を持つが、動物の中には二種以下の色覚細胞を持つものや3種類より多くの色覚細胞を持つ動物もいる。例えば、シャコ (mantis shrimp)は12種類もの色覚細胞を持つことが知られている (ただし、12種類の色覚で混合色を作るわけではないことが近年の研究 [3] で明らかになった)。

補足: 中心視野と周辺視野

明るさを感じる桿体細胞は網膜上で周囲領域に多く集まっており、錐体細胞は網膜の中心に多く集まっている。そのため、人間の視覚においては中心視野において色を感じやすく、周辺視野では輝度のコントラストに基づく運動情報などを感じやすい。

2.1.1. Young-Helmholtzの三色説#

Youngの干渉実験でも知られる物理学者のThomas Youngは、光の波長がある程度ことなる3つの単波長光を適切に混色すると白色光と見分けがつかない光が作り出せることを発見した。同様の性質は単波長光を2つしか用いない場合には実現できず、彼は3つの光として、赤、緑、バイオレットの三色が基本色であると考えた。

その後、生理学者のHermann von Helmholtzは、人間の網膜に赤、緑、バイオレット(または青)の三色に強く反応する視細胞(今日の錐体細胞)の存在を予言した。このように、YoungとHelmholtzによって提唱された色の三原色の組み合わせによる色の表現方法をYoung-Helmholtzの三色説 (Young Helmholtz trichromatic theory)と呼ぶ。

今日でも、光の三原色として赤、緑、青の三成分が用いられている他、多くの表色系においても、性質のことなる3つの成分を用いて色を表現するのが一般的である。

2.1.2. Heringの反対色説#

神経学者のHeringは、赤、緑、青 (バイオレット)の三色を基本とするYoung-Helmholtzの三色説に対して、次のようなことを考えた。

  • オレンジは、赤と黄色が混ざった色に見える

  • シアンは、緑と青が混ざった色に見える

  • しかし、赤と緑が混ざったように見える色や青と黄色が混ざったように見える色は思いつかない

この仮定に基づき、Heringは色の表現方法として赤-緑の成分、青-黄色の成分、白-黒の成分という3つの互いに対立する色の組み合わせを用いることを提唱した。このような色の表現方法をHeringの反対色説と呼ぶ。

実際、後述する光の混色においては、赤に似た色であるマゼンタと緑の混色は無彩色になり、同様に青と黄色の混色も無彩色となる。従って、Heringの考えた「青と黄が混ざった色 (=有彩色)」というのは実際に定義しがたい色であることが分かる。

2.1.3. Munsell表色系#

アメリカの画家で美術教育者のAlbert Munsellは、色を色相 (hue)、明度 (value)、彩度 (chroma) という三つの指標で表すことを提案した。

Munsellが提案した表式では、色相は円状に配置される。その中の代表的な色として、赤、黄、緑、青、紫の5色が取られ、その間を補間する色が間に配置される。このルールに基づいて円上に代表色を配置したものをMunsellの色相環と呼ぶ。

<https://upload.wikimedia.org/wikipedia/commons/d/d1/MunsellColorCircle.png>

図 2.2 Munsellの色相環
CC BY-SA 3.0 © Wikipedia Commons 出典
#

Munsellの色相環は彩度と輝度の情報を追加することで三次元に拡張することもできる。輝度を高さ方向に、彩度を半径方向に取ると、Munsellの色立体と呼ばれる歪な形の立体が得られる。

<https://upload.wikimedia.org/wikipedia/commons/1/1e/Munsell_1943_color_solid_cylindrical_coordinates_gray.png>

図 2.3 Munsellの色立体
CC BY-SA 3.0 © Wikipedia Commons 出典
#

Munsellの色立体上では、人間が知覚可能な色のみが描かれている。人間の知覚は色ごとに感じられる輝度や色の濃さが異なるので、Munsellの色立体は 図 2.3のような歪な形となる。

2.1.4. 加法混色と減法混色#

代表的には色が赤、緑、青の三成分で表されるとして、その三色で定義される空間の内部をどのように表現するかには、二通りの方法がある。例えば、読者の皆さんは、赤色と青色を混ぜると何色になると思うか、少し考えてみてほしい。

おそらく、多くの読者は「紫色」と答えたことと思う。これは答えの一つであり、もう一つの答えはピンクに近い色である「マゼンタ」である。紫色は赤色の青色の「絵の具」を混ぜたときに得られる色であり、マゼンタは赤色の光と青色の「光」を混ぜたときに得られる色である。

光は重ねるとだんだん明るくなっていくので、複数の色を混ぜると白色に近づいていく。このようなメカニズムに基づく色の混ぜ方を加法混色と呼ぶ。一方、絵の具は光の色を吸収することで、吸収されない側の色が人間の目に入ってくる。従って、絵の具を混ぜると、より多くの色が吸収されることになり、吸収されない側の色はだんだん暗く、すなわち黒に近づいていく。このようなメカニズムに基づく色の混ぜ方を減法混色と呼ぶ。

../_images/color_blending.jpg

写真は、フィルムや光学素子に届く光の強さを記録したものなので、加法混色に基づく色表現を用いるのが一般的である。一方で、プリンタなどの印刷器では、インクの混色により色を表現するため、減法混色に基づく色表現を用いることが多い。

通常、プリンタのインクは黒とシアン、マゼンタ、イエローの4色で構成されている。この4色を基本とする色空間を CMYK表色系 と呼ぶ。CMYKのC, M, Yはそれぞれシアン (cyan), マゼンタ (magenta), イエロー (yellow)の頭文字であり、KはKeyの頭文字で黒に対応している。写真などのようにRGB表色系で表されているデータであっても、プリンタで印刷する際にはCMYK表色系に変換された後に、インクを用いて印刷される。

色の表現

  • Young-Helmholzの三色説により三つの異なる光の混色によって白色の光と見分けがつかない光が得られることが示された

  • Heringの反対色説では、光が赤-緑, 青-黄, 白-黒の3つの反対色の軸によって表せると考えた

  • Muncellの表色系では、色を色相、彩度、輝度の3つの要素によって記述する

2.2. 色空間#

一度、デジタル画像がRGB色空間で表現されると、そこから目的に応じて他の色空間への変換が可能となる。例えば、Munsell表色系のように色相、彩度、輝度の三成分を用いて表現される色空間にはHSV色空間HSL色空間があり、Heringの反対色説に基づくような色空間にはYUV色空間やYCbCr色空間などがある。

しかし、デジタル画像に記録されるRGBの値は、より厳密には一体何を表しているのだろうか。人間の目に知覚される色は、物理的には波長の異なる光の組み合わせで構成されている。具体的には、光は異なる波長 \(\lambda\) ごとに異なる強度を持っており、その分布は分光強度分布 \(S(\lambda)\) で表される。

本項では、この分光強度分布 \(S(\lambda)\) を知覚色である赤、緑、青の三成分に変換する方法について見ていきたい。

2.2.1. 等色関数#

色空間を理解する上で重要な考え方の一つに等色関数がある。等色関数とは、とある波長の単色光が与えられたときに、赤、緑、青の単色光をどのくらいの割合で混ぜると、人間の視覚が同じ色だと感じるかを表した関数である。人間が同じ色だと感じるようになることを動詞として等色するという。

より厳密には、赤、緑、青と述べた光は必ずしも単色光でなくとも良く、何らかの適当な光の混色であっても良い。この混色の元となる光のことを 原刺激 と呼ぶ。この原刺激にどのような色の光を使うかは色空間の定義によって異なる。

等色関数の測定実験は 図 2.4 に示すような環境で実施される。被験者は遮蔽板で区切られた二つの領域を見ており、各領域には一方に参照光、もう一方に原刺激を混色した光が当てられている。参照光を固定して、原刺激をの強さを調整したときに、被験者が同じ色だと感じたら、その光の強度を等色関数の値とする。

../_images/cmf_test.jpg

図 2.4 等色関数の測定実験#

CIE 1931 RGB表色系 (以後、CIE RGB表色系)では、原刺激として波長が700nm、546.1nm、435.8nmの三種類の単色光を用いて測定が行われた。CIE RGB表色系の等色関数を 図 2.5 に示す。このグラフは、参照光の波長 \(\lambda\) が横軸に取られている。

赤、緑、青の原刺激に対応する \(\bar{r}(\lambda)\), \(\bar{g}(\lambda)\), \(\bar{b}(\lambda)\) の値は、可視光の範囲で積分したときに同じ値になるように正規化されている。すなわち以下の式が満たされる。

(2.1)#\[ \int_0^\infty \bar{r}(\lambda) \mathrm{d} \lambda = \int_0^\infty \bar{g}(\lambda) \mathrm{d} \lambda = \int_0^\infty \bar{b}(\lambda) \mathrm{d} \lambda \]

実際に参照光と同じ色を得るためには、輝度の比として 1 : 4.5907 : 0.0601 の強さを持つ単色光を用意し、その光の強度を \(\bar{r}(\lambda)\), \(\bar{g}(\lambda)\), \(\bar{b}(\lambda)\) に設定して混色すれば良い。

../_images/86ff4405266274643b1fa814e23838b1ce194788e9e174fc15b1c460b817b242.png

図 2.5 CIE RGB表色系の等色関数#

図 2.5 をよく見てみると、 \(\bar{r}(\lambda)\) の値が一部の波長で負の値を取っていることが分かる。図 2.4では、一方に参照光、他方に原刺激が当てられていたが、負の値の意味するところは、とある原刺激を参照光側に移動して混色することを意味する。520nm付近の \(\bar{r}(\lambda)\), \(\bar{g}(\lambda)\), \(\bar{b}(\lambda)\) の値を例に取ると、参照光と赤色の原刺激を混色したものが、緑色と青色の原刺激を混色したものと等色したことを意味する。

またCIE RGB表色系の等色関数からはいくつかの色の性質が読み取れる。分かりやすいところでは、原刺激に対応する波長、すなわち 700nm, 546.1nm, 435.8nmの箇所では、原刺激の1つが非零の値を、その2つの原刺激は0を取っている。

また、原刺激の波長に対応する箇所以外では、3つの原刺激の強さの少なくとも一つは負の値を取っている。参照光として用いられる光は単色光であり、この光は彩度が最大であると考えられる。一方で、加法混色の場合には光を混色すると彩度が下がる方向に向かう。したがって、必ず負の値が現れる、ということは、原色に対応する単色光の色はいかなる原刺激の混色でも表せないことを意味している。

2.2.2. Grassmannの法則#

とある単色光 \(C_1\)と等色する原刺激の強さが \((R_1, G_1, B_1)\)であるとする。また、別の単色光 \(C_2\)と等色する原刺激の強さは \((R_2, G_2, B_2)\)であるとする。このとき、\(C_1\)\(C_2\)を混色して得られる色 \(C_3\) と等色する原刺激の強さは \((R_1 + R_2, G_1 + G_2, B_1 + B_2)\) となる。この法則を Grassmannの法則 と呼ぶ。

この法則を用いると任意の分光分布 \(S(\lambda)\) を持つ光を表すのに必要な原刺激の強度 \(R\), \(G\), \(B\)は次のように表せる。

\[\begin{split} \begin{align*} R = \int_0^{\infty} S(\lambda) \bar{r}(\lambda) \mathrm{d} \lambda \\ G = \int_0^{\infty} S(\lambda) \bar{g}(\lambda) \mathrm{d} \lambda \\ B = \int_0^{\infty} S(\lambda) \bar{b}(\lambda) \mathrm{d} \lambda \end{align*} \end{split}\]

この結果は、人間が知覚できる任意の色が、たとえ物理的に異なる分光分布を持っていたとしても、\(R\), \(G\), \(B\)の三成分によって記述できることを意味している。

2.2.3. CIE XYZ表色系#

CIE RGB表色系は部分的に負の値を取るため、扱いが複雑になることがある。そこで、CIE XYZ表色系はCIE RGB表色系の原刺激の値を線形変換することで、等色関数が可視光範囲内で非負の値をとるように定義している。

CIE XYZ表色系で用いられる原刺激は実際に存在する光ではなく、仮想的な光で、それぞれの等色関数を \(\bar{x}(\lambda)\), \(\bar{y}(\lambda)\), \(\bar{z}(\lambda)\) のように表す。この際、 \(\bar{y}(\lambda)\) は、錐体細胞の明るさ感度関数 \(V(\lambda)\) と同じになるように定義される。CIE XYZ表色系の等色関数は 図 2.6 のようになる。

../_images/18fa08e617af7cd4d5f10c58738ad93ede090163b150ae4fca47049898b9eb56.png

図 2.6 CIE XYZ表色系の等色関数#

CIE XYZ表色系で表された色の3要素 \((X, Y, Z)\) はCIE RGB表色系で表された色の3要素 \((R, G, B)\) から求められる。

(2.2)#\[\begin{split} \begin{align*} \begin{pmatrix} X \\ Y \\ Z \end{pmatrix} &= \frac{1}{0.17697} \begin{pmatrix} 0.49000 & 0.31000 & 0.20000 \\ 0.17697 & 0.81240 & 0.01063 \\ 0.00000 & 0.01000 & 0.99000 \end{pmatrix} \begin{pmatrix} R \\ G \\ B \end{pmatrix} \\ &= \begin{pmatrix} 2.7688 & 1.7517 & 1.1301 \\ 1.0000 & 4.5906 & 0.0601 \\ 0.0000 & 0.0575 & 5.5942 \end{pmatrix} \begin{pmatrix} R \\ G \\ B \end{pmatrix} \end{align*} \end{split}\]

(2.2)に現れる行列の係数はどこからやってきたのだろうか。この変換の意味を少し考えてみたい。

(2.2)の1行目に現れる \(3 \times 3\) の係数行列は横に要素を足し上げるとすべての行で1となるように値が設定されている。これは、 (2.1)に示したような性質を \(\bar{x}(\lambda)\), \(\bar{y}(\lambda)\), \(\bar{z}(\lambda)\)にも持たせるためのもので、実際、これらの等色関数は次の等式を満たす。

(2.3)#\[ \int_0^\infty \bar{x}(\lambda) \mathrm{d} \lambda = \int_0^\infty \bar{y}(\lambda) \mathrm{d} \lambda = \int_0^\infty \bar{z}(\lambda) \mathrm{d} \lambda \]

また、(2.2)の2行目に現れる \(3 \times 3\) の係数行列の2行目の3つの係数は、CIE RGB表色系の計測実験に用いられた原刺激の強さに基づくことが確認できる。

これに加えて、XYZ表色系において、

\[ x = \frac{X}{X + Y + Z}, \quad y = \frac{Y}{X + Y + Z} \]

のように\(x\), \(y\)を定義して、xy平面上に色をプロットしたものを色度図と呼ぶ。

定義から、CIE XYZ表色系においては、全ての色度がxy色度図上の\((0, 0)\), \((0, 1)\), \((1, 0)\)の三角形の内側に収まる。さらに、可視光の色度は、その三角形の内側で 図 2.7に示すような馬蹄状の範囲を占める。

../_images/2c324910abdbfe6a2351534aa2b06d60b0007a9d14686ac02d2a0b190a0ff70a.png

図 2.7 CIE 1931 xy色度図#

2.2.4. CIE L*a*b*表色系#

CIE 1976 L*a*b*表色系 (以後、簡単のためにCIE Lab表色系)は、CIE XYZ表色系を基にして、 色覚的均一性 を持つように定義された色空間である。色覚的均一性とは、任意の2つの色が与えられたときにLab色空間上での距離が人間の感じる色の違いに概ね比例するような性質を指す。

CIE Lab表色系による色表現はCIE XYZ表色系の3要素 \((X, Y, Z)\) から次のように計算できる。

(2.4)#\[\begin{split} \begin{align*} L^{*} &= 116 f(Y / Y_n) - 16 \\ a^{*} &= 500 (f(X / X_n) - f(Y / Y_n)) \\ b^{*} &= 200 (f(Y / Y_n) - f(Z / Z_n)) \end{align*} \end{split}\]

ただし、 \(X_n\), \(Y_n\), \(Z_n\)は参照白色点の値を表す。例えば、D65と呼ばれる参照白色点の場合には、\(X_n = 95.047\), \(Y_n = 100\), \(Z_n = 108.883\)となる (ただしY = 100として正規化した場合)。また、関数\(f\)は次のように定義される。

\[\begin{split} f(t) = \begin{cases} t^{1/3} & (t > \delta) \\ \frac{t}{3 \delta^2} + \frac{4}{29} & (t \leq \delta) \end{cases} \end{split}\]

CIE Lab表色系において、明度成分に対応するL*はおおむね0から100の値を取る。一方で、色度成分を表すa*やb*は、正負両方の値をとるものの、その範囲は参照白色点の値によって異なる。

CIE Lab表色系で表された2つの色同士の距離をEuclid距離で計算したものを色差と呼び、色差が大きいほど人間の目で見たときの色の違いも大きくなる。

2.2.5. sRGB色空間#

ここまでのCIE XYZ表色系やCIE Lab表色系は物理的な光のに対する人間の色知覚を基にしてモデル化されていた。デジタル画像に用いられる一般的な色空間である sRGB色空間Adobe RGB色空間 は、CIE XYZ表色系を基準にして定義されている。

sRGB色空間とAdobe RGB色空間は、いずれも赤、緑、青の三成分を用いる色空間であるが、個々の色空間の定義によって、赤、緑、青の各成分が表す色が異なっている点に注意が必要である。

従って、とあるデジタル画像に記録された画素の色を見たときに、それがsRGB色空間で表された色なのか、Adobe RGB色空間で表された色なのかが分からないと、正確な色を再現することはできない。

sRGB色空間とAdobe RGB色空間のそれぞれで定義されている基準色、すなわち赤、緑、青の色度は 図 2.7 におけるxy座標上で次のように定義されている。

表 2.1 sRGB表色系の三原色の色度#

色成分

x座標

y座標

赤 (R)

0.6400

0.3300

緑 (G)

0.3000

0.6000

青 (B)

0.1500

0.0600

白 (D65)

0.3127

0.3290

表 2.2 Adobe RGB色空間の三原色の色度#

色成分

x座標

y座標

赤 (R)

0.6400

0.3300

緑 (G)

0.2100

0.7100

青 (B)

0.1500

0.0600

白 (D65)

0.3127

0.3290

sRGB色空間とAdobe RGB色空間の定義における色度点と白色点のうち、異なっているのは緑の色度だけであり、その他の成分は同じである。

sRGB色空間における、赤、緑、青の値とCIE XYZ表色系との関係は sRGBとCIE XYZの相互変換 に示したので、詳細に興味のある読者はそちらを参照してほしい。

デバイス依存色とデバイス独立色

前述の通り、sRGB色空間は、CIE XYZ表色系を基にして定義されているため、人間の知覚する色とある程度明確な対応関係がある。

しかし、定義の上でどのような色であるかが決まっているとしても、カラー画像をディスプレイに表示したり、プリンタを用いて印刷物にする場合、たいていは各デバイスが表現できる色には物理的な制約がある。従って、データとしての色が同じであっても、異なるディスプレイや異なるプリンタで表現される色は必ずしも同じではない。このようなデバイスに依存する色表現を デバイス依存色 と呼ぶ。

これに対し、sRGB色空間やCIE XYZ表色系のような物理的な定義を持つ色空間は、特定のデバイスに依存しないため デバイス独立色 と呼ばれる。

練習問題

画像のグレースケール化は、画像処理の中でも基本的な処理の一つである。グレースケール化は赤、緑、青の3つの色度の重み付き線形和が白色点の値と等しくなるような重みで定義される。すなわち、グレースケール化された画像の画素の値 \(Y\) は、元の画像の画素の赤、緑、青の値をそれぞれ \(R\), \(G\), \(B\) としたときに、

\[ Y = w_R R + w_G G + w_B B \]

であり、重み \(w_R\), \(w_G\), \(w_B\) は次の式を満たすように定義される。

\[\begin{split} \begin{cases} w_R x_R + w_G x_G + w_B x_B &= x_W \\ w_R y_R + w_G y_G + w_B y_B &= y_W \\ w_R + w_G + w_B &= 1 \end{cases} \end{split}\]

従って、グレースケール化に用いられる重みは色空間の定義によって異なる。sRGB色空間とAdobe RGB色空間のそれぞれについて、グレースケール化のための重み \(w_R\), \(w_G\), \(w_B\) を求めよ。

2.3. デジタル画像の取得#

ここまで、画像の色表現に用いられる色表現について見てきたが、ここからは、デジタルカメラによるデジタル画像の取得の流れについて見ていこう。この処理の流れのことを専門的には 画像化パイプライン (imaging pipeline) と呼ぶ。

本題に入る前に、物理的な色がどのようにデジタル画像に変換されるのかをイラストで確認しておく。

../_images/imaging_pipeline.png

図 2.8 画像の撮影からデジタル画像 (sRGB形式) 取得までの流れ#

図 2.8 に示すように、一般的なカラーイメージセンサでは、最初にRAW画像が得られ、それがいくつかの変換を通して線形RGB画像となり、その後、より表示に適した形としてsRGB画像に変換される。

2.3.1. カラー画像の取得#

前節 デジタル画像 ではCCDあるいはCMOSをイメージセンサとして用いることで光の強さをデジタルデータとして記録できることを述べた。しかし、通常のイメージセンサは 光の強さを記録 するだけで、色の情報を記録する機能は持ち合わせていない。

そのため、一般的なデジタルカメラは、CCDやCMOSのセンサが並んだセンサアレイ上にBayerフィルタと呼ばれる色フィルタが備え付けられており、各イメージセンサは赤、緑、青のいずれかの色フィルタを通した光の強度を観測する。この際、人間の視覚系が緑の光に対して相対的に高い感度を持つことから、Bayerフィルタ上は赤、緑、青に対するイメージセンサの数の比が1 : 2 : 1になるように設計されている。

Bayerフィルタを通して得られたセンサの信号強度を表す画像を RAW画像 と呼ぶ。RAW画像は各画素が赤、緑、青のいずれかの値しか持っていない。このような画像をモザイク画像と呼ぶ。

したがって、全画素が色を持つようなカラー画像を得るためには事後的な画像処理が必要である。このようなモザイク画像からカラー画像への変換処理を デモザイク処理 (demosaicing)と呼ぶ。

デモザイキングによって得られたRGB画像は、光の強さに対して線形な輝度値を持つため 線形RGB画像 (linear RGB image)と呼ばれる。

モザイク画像

デモザイキング後

../_images/c90de0bc1a197fc9360b5a59417832b7e733daef505f8afe0c6b8024229090aa.png

../_images/eeddcb17dbfdf6bcfc53dcfaf36151169e6afb33915ddbf595bfc562ecbf8a50.png

デモザイク処理には様々なアルゴリズムがあり、最も単純な方法は、各画素の色を、その周囲の画素の色によって補間する方法である。この手法をバイリニア法と呼ぶ。より詳細なアルゴリズムについては デモザイク処理のアルゴリズム を参照のこと。

ホワイトバランス#

線形RGB画像は、光の強度に比例した画素値を持つため、光源の色の影響を強く受ける。例えば、白色電球の下で撮影された画像と屋外で太陽光の下で撮影された画像では、同じ物体であっても見た目が異なるのは当然である。

このような光源の色の影響が残った色が、そのままデジタル画像として保存されると、人間の目にとっては不自然に感じられることがある。これは、人間の視覚には 色の恒常性 (color constancy) と呼ばれる性質があるためである。

色の恒常性とは、光源の色が変化しても、物体の色は変わらないように感じる性質を指す。例えば、青リンゴは、太陽光の下では青く見えるが、夕方のオレンジ色の光の下で見たとしても、それを赤りんごだと勘違いすることは少ないだろう。

デジタル画像においても、色の恒常性に着想を得た色調の補正処理が行われており、その一つに ホワイトバランス がある。名前の通り、ホワイトバランスはシーン中で白色の物体がデジタル画像の中でも白色になるように色調を補正する処理である。

最も単純なホワイトバランスの方法は、線形RGB画像中の画素の値の平均値が無彩色であるとみなして、各画素の色を平均色の値で除する方法である。この方法は グレイワールド法 (gray world method) とも呼ばれる。また、シーン中に白色の領域があると仮定し、画像全体の輝度の最大値で各画素の色を除する方法もあり、こちらは 白色パッチ法 (white patch method) と呼ばれる。

Land効果

人間の色の恒常性を説明するための有名な例に Land効果 がある。Land効果とは、二枚の白黒のフィルムを異なる色の光源を通して重ねるとカラー画像が知覚されるという効果であり、Edwin Landによって発見された。

より具体的には、とあるシーンを赤のフィルム (R画像とする)と緑のフィルム (G画像とする)を通して別々に撮影し、R画像を白色の光で照らし、G画像を赤色の光で照らして重畳すると、同様のシーンのカラー画像が知覚されるという効果である。

その後のLandの研究で、人間の色知覚は、シーンの中の物体の色を、シーン中の各点から得られる色の相対的な関係性から推定することが示唆された。これらの結果をまとめた体系的な理論は Retinex理論 と呼ばれ、現在も、色の恒常性に関する基本的な理論として広く知られている。

トーンマッピング#

ホワイトバランスによってデジタル画像の色が補正できたが、この時点での線形RGB画像は、JPEG画像などに保存するには含まれる輝度の範囲が広すぎる。そこで、線形RGB画像の輝度を人間の知覚できる範囲に収めるための処理が必要となる。このような処理を トーンマッピング と呼ぶ。

通常のトーンマッピングはS字の形状を持ったトーンマップ関数で行われ、線形RGB画像の暗い部分と明るい部分の輝度が圧縮される。これは、暗い部分の輝度がセンサのノイズの影響を受けやすく、また明るい部分の画素値がセンサの計測の上限に達して不正確となってしまうためである。

このようにして過度に暗い画素と過度に明るい画素の影響を抑制した後、線形RGB画像の画素値を0から1などの範囲に正規化する。

ガンマ補正#

ここまでのホワイトバランスとトーンマッピングにより、画素値の範囲が0-1の範囲に収まるように正規化された画像が得られた。しかし、ここで得られている画像の画素値は、依然として光の強さに概ね比例するように画素値が記録されている。

一方で、人間が光の明るさを知覚する場合には、物理的な光の強さが2倍になったからといって、2倍明るく感じるわけではない。実際、人間の視覚は、光の強さを線形に感じるわけではなく、暗い光の変化に敏感な一方で、明るい光の変化にはそれほど敏感でない。そこで、人間にとって自然な色表現を得るために、線形RGB画像に対して非線形な輝度変換を施す。このような輝度変換を ガンマ補正 (gamma correction)と呼ぶ。

ガンマ補正にはガンマ値と呼ばれるパラメータ\(\gamma\)があり、多くの場合は \(\gamma = 2.2\)が用いられる。ガンマ補正の式は単純には次のように表される。

(2.5)#\[ I_{\text{out}} = I_{\text{in}}^{\frac{1}{\gamma}} \]

ただし、 \(I_{\text{in}}\) は入力の強度、 \(I_{\text{out}}\) は出力の強度でそれぞれ0から1の範囲の値を取るものとする。

なお、前述のsRGB色空間では、\(\gamma = 2.2\)とする代わりに、暗い色は線形に変換し、明るい色はガンマ値を\(\gamma = 2.4\)として変換するような変換が行われる。

(2.6)#\[\begin{split} I_{\mathrm{out}} = \begin{cases} 12.92 I_{\mathrm{in}} & (I_{\mathrm{in}} < 0.0031308) \\ 1.055 I_{\mathrm{in}}^{1 / 2.4} - 0.055 & (I_{\mathrm{in}} \geq 0.0031308) \end{cases} \end{split}\]

これは、非常に暗い輝度の変化が、JPEGなどの8bit符号なし整数を用いる画像フォーマットで過度に量子化されるのを防ぐためである。

../_images/67669b9bc9689e21491b99b4de440973229cfdb8ad5b81a2bfe8568c00d2a638.png

図 2.9 ガンマ補正関数の比較#

2.4. 高ダイナミックレンジ画像#

前述の通り、各画素に記録された色情報は有限のビット深度を持っている。従って、画像の中で表現できる色、あるいは光の暗さ・明るさには制限がある。このような表現 (知覚・表示)できる明るさの範囲のことを ダイナミックレンジ (dynamic range)と呼ぶ。

実は、人間の視覚にも一度に知覚できる光の強度には一定の幅がある。そのため、暗い部屋から明るい場所に出たときに、しばらく周囲が眩しく感じることがある。この際、人間の視覚では周囲の明るい状況に応じて知覚できる光の強度範囲を変化させる明順応が起こっている (逆に暗い環境に合わせて知覚を調整する機能を暗順応と呼ぶ)。

デジタル画像上で高いダイナミックレンジを持つ画像を表すには、より多くのビットを色の記録に用いる必要があり、前述のRAW画像は14ビット前後のビット深度 (カメラの機種により異なる)を持っていることが多い。そのため、RAW画像を撮影後に編集することで、人間の暗順応や明順応の要領で、8ビット深度のJPEG画像にどの範囲の明るさを残すかを決めることもできる。

このように相対的に言って記録されている画素値のダイナミックレンジが狭いを 低ダイナミックレンジ画像 (low-dynamic-range image, LDR) や標準ダイナミックレンジ画像 (standard dynamic range image) と呼ぶ。反対に、より広いダイナミックレンジを表現できる画像を 高ダイナミックレンジ画像 (high-dynamic-range image, HDR)と呼ぶ。

通常、LDRやSDRの画像は8bit深度で各色成分が表され、HDR画像はそれより多いビット数で各色成分が表される。HDR画像を記録するためのフォーマットにはOpenEXR形式やRadiance RGBE形式などがあり、これらのフォーマットは各色成分を16bitや32bitで表している。

2.4.1. HDR画像合成#

狭いダイナミックレンジしか持たないLDR画像を取り出す明るさを変えながら複数枚撮影し、それらの画像を合成することで事後的にHDR画像を作り出す技術がある。この技術を HDR画像合成 (HDR imaging)と呼ばれ、現在はスマートフォンなどにも搭載されている機能である。

スマートフォンを用いて写真を撮影しているとそれほど意識することはないが、写真の明るさは、絞りをどれくらい開いているか、シャッターをどのくらいの時間開けているか、などの複数の要因によって決まる。HDR画像合成を行う場合には、シャッターを開けている時間を変えながら撮影することが多い。

HDR画像合成の技術は、1997年にPaul Devebecらによって提案されたもので、ビット深度がいくつであっても、露出を変更しながら複数の画像を撮影することでダイナミックレンジを持つ画像が撮影できる可能性を示した [4]。この技術は、コンピュータ・グラフィクスにおいて画像を光源の代わりに用いる環境マップを作成するうえで大変重要である。

反対に高いダイナミックレンジを持つ画像を見た目の情報をなるべく保持するようにLDR画像に変換する技術も非常によく研究されている。このような技術は トーンマッピング (tone mapping)と呼ばれており、代表的なものにはReinhardらが2002年に提案した手法[5]やFattalらが2002年に提案した手法[6]などがある。

../_images/hdr_synthesis.png

図 2.10 HDR画像合成の例。右側の合成結果はトーンマップ済みの画像 (画像出典)#

2.5. プログラミング演習#

グレースケール画像の計算

最も一般的に用いられているグレースケール化の手法は赤、緑、青の成分を (0.299, 0.587, 0.114) の比率で加重平均してグレースケール画像に変換するもので、これはアナログテレビのNTSC規格で定められたグレースケール化の方法である。

一方で、sRGB色空間で定義されたカラー画像をグレースケール画像に変換する場合には、赤、緑、青の成分を (0.2126, 0.7152, 0.0722) の比率で加重平均する。しかし、これらの結果は必ずしも良いグレースケール画像を与えるとは限らない。

別の方法に、画像の色を主成分分析して、第一主成分方向に沿った値をグレースケールの値とみなす方法がある。上記の加重平均を用いた手法と主成分分析を用いる手法のプログラムを作成し、結果の違いについて考察せよ。

ヒント: モネの絵画 印象 日の出を入力画像にして実験してみると結果が分かりやすい。

視覚的カラーマップの等距離性 (発展)

Matplotlibには viridisinfernoといった知覚的に均一なカラーマップがいくつか用意されている (参考)。このカラーマップ上の値を取得し、CIE Lab色空間上において、各色がおよそ等間隔に並んでいることを確認せよ。

なお、カラーマップからRGBで表された色を取り出すには次のようにすれば良く、ここで得られる数値がsRGBの値であるとしてプログラムを作成せよ。

import numpy as np
from matplotlib import cm

vals = np.linspace(0.0, 1.0, 256)
cmap = cm.viridis(vals)[:, :3]

2.6. 補足#

2.6.1. sRGBとCIE XYZの相互変換#

sRGB色空間はCIE XYZ表色系を基にして定義されているため、デジタル画像に記録されている画像をCIE XYZ表色系の値に変換することも可能である。以下では、sRGBからCIE XYZ、ならびにCIE XYZからsRGBへの変換方法について説明する。

sRGBからCIE XYZへの変換#

sRGBからCIE XYZへの変換は次のように行う。sRGBの値は通常0から255の間の整数値ないし、0から1の間の実数値で表されている。ここでは、0から255の整数値で表されている場合にはあらかじめ255で除しておき、0から1の間の実数値に変換してから以下の操作を行う。

まず、sRGBの値を逆ガンマ補正によりLinear RGBと呼ばれる値に変換する。

\[\begin{split} C_{\text{linear}} = \begin{cases} \frac{C_{\text{sRGB}}}{12.92} & (C_{\text{sRGB}} \leq 0.04045) \\ \left( \frac{C_{\text{sRGB}} + 0.055}{1.055} \right)^{2.4} & (C_{\text{sRGB}} > 0.04045) \end{cases} \end{split}\]

ここで、\(C_{\text{sRGB}}\)はsRGBの各成分の値、\(C_{\text{linear}}\)はLinear RGBの各成分の値を表す。次に、Linear RGBからCIE XYZへの変換を行う。

\[\begin{split} \begin{pmatrix} X \\ Y \\ Z \end{pmatrix} = \begin{pmatrix} 0.4124 & 0.3576 & 0.1805 \\ 0.2126 & 0.7152 & 0.0722 \\ 0.0193 & 0.1192 & 0.9505 \end{pmatrix} \begin{pmatrix} R_{\text{linear}} \\ G_{\text{linear}} \\ B_{\text{linear}} \end{pmatrix} \end{split}\]

ただし、Linear RGBからCIE XYZへの変換に用いる行列は「白色がどの色か」によって異なる。上記の例はD65と呼ばれる白色点を用いた場合の変換行列であるので注意すること。

CIE XYZからsRGBへの変換#

CIE XYZからsRGBへの変換は、sRGBからCIE XYZへの変換の逆変換を行う。まず、CIE XYZからLinear RGBへの変換を行う。

\[\begin{split} \begin{pmatrix} R_{\text{linear}} \\ G_{\text{linear}} \\ B_{\text{linear}} \end{pmatrix} = \begin{pmatrix} 3.2406 & -1.5372 & -0.4986 \\ -0.9689 & 1.8758 & 0.0415 \\ 0.0557 & -0.2040 & 1.0570 \end{pmatrix} \begin{pmatrix} X \\ Y \\ Z \end{pmatrix} \end{split}\]

先ほどと同様、上記の行列もD65を白色点として用いた場合の行列であることに注意すること。次に、ガンマ補正により、Linear RGBからsRGBへの変換を行う。

\[\begin{split} C_{\text{sRGB}} = \begin{cases} 12.92 C_{\text{linear}} & (C_{\text{linear}} \leq 0.0031308) \\ 1.055 C_{\text{linear}}^{1/2.4} - 0.055 & (C_{\text{linear}} > 0.0031308) \end{cases} \end{split}\]

2.6.2. デモザイク処理のアルゴリズム#

デモザイキングには非常に多数のアルゴリズムが提案されている[7]が、最もシンプルなアルゴリズムは、モザイク画像の各色の情報を、有効値を持つ隣接画素の値の平均によって求めるバイリニア補間である。

上記のモザイク画像は赤、緑、青の成分が次の条件を満たす画素で有効値を持つ (x座標, y座標ともに0から始まる整数)。

  • 赤成分: x座標が奇数かつy座標が偶数

  • 緑成分: x座標とy座標がともに偶数あるいはともに奇数 (x座標とy座標の和が偶数)

  • 青成分: x座標が偶数かつy座標が奇数

以下の図に示す通り、赤と青の成分を補間する場合には隣接する有効画素が2つの場合と4つの場合が存在する。一方、緑成分を補間する場合、隣接する有効画素はいずれも4つ存在する。

../_images/demosaicing.png

図 2.11 赤、緑、青の各成分に対するデモザイキングの例#

ただし、バイリニア補間のように空間的に近い位置の画素を全て平均してしまうと、エッジのような輝度の変化を持つ部分で色がぼやけてしまい、結果として、エッジ付近に偽色 (false color)と呼ばれる色のにじみやジッパー効果 (zipper effect)と呼ばれるゴマ粒上のアーティファクトが発生してしまう [8]

このような問題を防ぐ手法の一つに エッジセンシング手法 と呼ばれる手法がある。エッジセンシング手法では、周囲の有効値を持つ画素の情報を用いて、x方向ならびにy方向のエッジ強度を最初に求め、各方向のエッジ強度の大小関係を用いて色の補間に用いる有効画素を選択する。