2014年4月7日月曜日

印刷パターンでカメラを簡単にガンマ補正する

明るさと輝度値の非線形性

カメラの画像から何かを計測する場合,とりわけ画像の色が重要となる場合,画素値と実際の明るさ(放射照度)の関係が重要となる. 一般には,画素値が2倍であっても明るさも2倍だとは言えない. ディスプレイに表示される色と明るさ(輝度)の関係でも同じことが言える. 下図を見れば,この現象が簡単に体験できる.

左から黒,灰,白と三色の正方形が3つ並んでおり,上下2段ある. 上段と下段の違いは中央灰色の正方形のみで,上段の色は255階調のうち127の色で塗りつぶされている. 一方,下段は白255と黒0の画素の面積の総和がちょうど半々になるように,市松模様が描かれている. 市松模様の各正方形は非常に小さいため遠目で見ると灰色に見えるという仕組み. 127はちょうど半分の輝度値であるはずで,黒と白が半々に混ざって見える市松模様も黒と白のちょうど中間の色に見えるはずが,上段と下段は異なる色のように見える場合がある(表示するディスプレイやカラー設定により異なる).

ディスプレイに画像を映す場合もこのような現象がおきるけど,カメラで撮影したときにも元の放射照度と画素値の間に似たような現象が起きることがある. 得られた画像を元の放射照度に比例するように画素値を変換することをガンマ補正と言ったりする. また,ガンマ補正というのは次に説明するような放射照度のガンマ乗の形をした変換関数を用いる補正のことを指すけど, 放射照度から画素値への一般的な変換関数を応答関数と言ったりする.

ガンマ補正の原理

ガンマ補正を数式で表してみる. 元の放射照度を$I$,何らかの非線形の変換を経て得られた画像の画素値を$I'$とするとこの式で書ける.

\[ I' = s(I)^\gamma = (a I + b)^\gamma \]

基本的には放射照度$I$を$\gamma$乗してるだけだけど,画素値なんてものは数値に物理的な単位もないし,画素値0が真っ黒に対応するとも限らないので$aI+b$のように自由度をもたせている.

ここで上の図の下段のようなパターンを印刷した紙をカメラで撮影して画像を得たとする. その時の黒,灰,白部分の画素値をそれぞれ$I'_b$,$I'_g$,$I'_w$とする. そんでそれらの元の放射照度を順に$I_b$,$I_g$,$I_w$とする. そうすると次の式が得られる.

\begin{eqnarray} I'_b &=& (a I_b + b)^\gamma\\ I'_g &=& (a I_g + b)^\gamma\\ I'_w &=& (a I_w + b)^\gamma\\ I_g &=& \frac{I_b + I_w}{2}\\ \end{eqnarray}

3つめがポイントでこれが灰色の部分と黒,白の放射照度を表している. つまり画像上では必ずしも黒と白の中間色にならなくても,紙表面の黒と白の点から来る光線が,半分半分に混ざり合って各画素に入ってきた結果グレーに写っていると考えるとこの式は正しい.

ガンマ補正の計算方法

ここではGnuplotのfitコマンドを使って簡単にガンマ補正してみる. まずデータの準備.これはdata.txtというテキストファイルに「$I\ I'$」の順に数値を記録したもの. 1行目から順に各業が黒,灰,白の部分に対応している. 右側の画素値は良いとして左側の放射照度はどうやって取得するんだよと思うかもしれないけど,放射照度のスケール(単位)は何でもいい. というのも最終的に得るのは補正された画素値であって放射照度ではないので,ここではどんなスケールでも得られる結果は同じ. 黒は真の真っ黒(放射照度0)だと信じて,1行目左は0に. 白は適当に255としたら,灰色は上の3つ目の式から半分の値で127とした(実数の方がいいかも).

0 25
127 40
255 98

次は,このデータ点に対してgnuplotでガンマ補正関数をフィッティングしてみる.

reset

#ガンマ補正関数
f(x) = a*x**gamma+b

#初期値
a = 1.0
b = 0.0
gamma = 1.0

#最小二乗法
fit f(x) 'data.txt' via a,b,gamma

#グラフ描画
plot 'data.txt'
replot f(x) lc 3

fit関数実行中にバラバラと最適化の途中結果が出力されたあと,次のように収束した解が得られる.

 :
 
After 183 iterations the fit converged.
final sum of squares of residuals : 0
abs. change during last iteration : -8.07794e-28


Exactly as many data points as there are parameters.
In this degenerate case, all errors are zero by definition.

Final set of parameters
=======================

a               = 0.000251373
b               = 25
gamma           = 2.27007

表示されるグラフはこのとおり.3点しかないので全点通る曲線が得られている.紙の黒い部分を完全な放射照度0としたので切片がかなり大きい. 放射照度の実測値を使わないでガンマ補正する以上,これは仕方ないのかも.

参考

  • Michael D. Grossberg and Shree K. Nayar: "What is the Space of Camera Response Functions?", IEEE Transactions on Pattern Analysis and Machine Intelligence

2014年4月6日日曜日

液晶シャッターメガネの動作様子(スローモーション)

家庭用の3Dテレビでは専用のメガネを書けなければ立体感が得られない。 立体視用のメガネは偏光と液晶シャッターの両方技術が使われている。 偏光は偏光フィルタなどを使うとその効果が容易に確かめられるが、 液晶シャッターの動作の様子はなんとなくちらつく程度しか普通は確認できないのではないか。 右目、左目交互にシャッターが切られている様子を、実際に見たことがあるだろう? 過去に小学生を対象とした公開講座のためにハイスピードカメラで液晶シャッターが動作する様子を記録した スローモーション映像を折角なので掲載しておく。何かの教材などに使われたら幸い。