カメラレスポンスカーブ

トップへ戻る

レスポンスカーブ?
カメラレスポンスカーブ
HDR Shopで出力したレスポンスカーブの最小値を0になるようにシフトしたもの。
縦軸がピクセル値。
デジタルカメラで撮影された画像は、実際の輝度で保存されるわけではなく、変換されて保存される。
これは JPEG 画像などの画素値が8bitしかないことと、人が感じる明るさが線形でないことが関係している。
デジタルカメラで撮影された画像は、8bitつまり 0〜255 の範囲よりも大きな範囲を記録するため、これを JPEG 化するには、 0〜255 に収める必要がある。
そして、人が感じる明るさは対数的であるため、人の感覚に近いように補正され、0〜255 に収められる。

このような画像を HDRI 化するには本当の輝度を復元する必要がある。
その復元に用いられるのがカメラレスポンスカーブと呼ばれるもので、ソフトウェアでは各画素値に対する係数として取り扱われている。
つまり、画素値にこの係数を掛け合わせるなどして本当の輝度を得る。

必要撮影枚数
カメラレスポンスカーブを得るには、最低2枚の露出値の異なる写真があれば良いようだ。
ただし、どのような写真でも2枚というわけではなく、十分な画素値の幅を持っている必要がある。
つまり、1枚の写真の中に画素値 0〜255 の値すべてが含まれている場合、2枚で十分ということになる。
当然、その幅を持っていない場合はカメラレスポンスカーブの復元は出来ない。
また、枚数が少ないとノイズの影響を受けやすい。
このため実際には、3〜4枚の露出値の異なる写真を用いる必要があると書かれている ( 出来れば5〜6枚あったほうがいいようだ ) 。

カメラレスポンスカーブは、シャッタースピード以外の値が同じ場合は同じになると記されている。
つまり、シャッタースピードのみを変えて撮れば、レスポンスカーブは再利用できる。
では、レスポンスカーブがわかっている場合、そのシーンの本当の輝度値を得て HDRI 化するには何枚必要なのだろうか?
これはシーンに依存する。
カメラレスポンスカーブを使って本当の輝度値を復元する際、主にレスポンスカーブの中心付近の直線部分を使う。
このことから、撮影しようとしているシーンの一番暗い場所と一番明るい場所がこの直線に部分にのるようにして、さらに露出値の異なる写真間で直線がつながるような枚数が必要になる。
ただ、直線部分以外はまったく使われないわけではないので、ある程度はその範囲にあっても良い。
ようは、一番暗い写真で白とびがなく、一番明るい写真で黒つぶれのないように撮影するということだ。
そのようにすれば、そのシーンの輝度を収めた HDRI が作れる。
しかし、現実問題として、完全に白とびなどをなくすと言うのは難しいかもしれない。
なので、ほどほどのところで妥協するのが良いと思う。

レスポンスカーブを求める
「 光の量 ( exposure ) = 光の強さ ( irradiance ) × 露出時間 ( X = EΔt ) 」と定義し、この光の量をある関数で補正したものをピクセル値と仮定する ( Z = f( X ) = f( EΔt ) )。
そして、このある関数をグラフ化したものがレスポンスカーブで、光の強さが HDR 画像の画素値となる。
式 Z = f( X ) = f( EΔt ) では、Z がピクセル値、X が光の量、Δt が露出時間。
知りたいのは、関数fの逆関数g (ピクセル値と露出時間から光の強さを求めるための関数) と 光の強さE。
もうひとつの式は複数の露出値で撮影した写真のピクセル値と露出時間と逆関数gから光の強さEを求める式になる (実際の式は複雑なので割愛。ここの論文参照)。

これらの式からコンピュータを用いてレスポンスカーブと光の強さEを求めるには、繰り返し計算して誤差を収束させる近似計算を行う必要がある。
具体的には、レスポンスカーブを例えば線形と仮定し、そのレスポンスカーブを用いて光の強さEを求める。
次に、この光の強さEを用いて、レスポンスカーブを計算する。
最初に仮定したレスポンスカーブと求めたレスポンスカーブの誤差を見て、一定値以下、つまり収束していると判断できればその求めたレスポンスカーブが、そのカメラの撮影時の設定のレスポンスカーブとなる。
収束していなければ、再度この求められたレスポンスカーブを用いて光の強さEを求める。
そしてまた、求まった光の強さEを用いて、レスポンスカーブを計算する。
で、再び収束しているか判定…… 以下、収束するまで繰り返しとなる。

以上のような処理によってレスポンスカーブ ( とHDR画像 ) は求められる。

重み付け

Wikipedia ガウス関数より
主にレスポンスカーブの中心付近の直線部分を使うと書いたが、具体的には重み付け関数を用いて処理する。
ここで言う重み付け関数は、コンピュータで計算する時は単なるピクセル値に対応した係数列となる。

重み付け関数には、主にガウス関数が使われるようだ。
ガウス関数とは、左図のような曲線を描く関数のこと。
グラフを見てわかるように中心付近が高く、端に行くほど低い。
このような性質のため、レスポンスカーブの中心付近の影響を大きく、端の方の影響は小さく出来る。
実際に使われるのはσ^2が8.0ほどのかなりなだらかな関数になる。

トップへ戻る