一般に、次の 2 つの問題を解決する必要があります。
1. 画像データを線形化する
(意味が明確でない場合: ピクセルによって収集される光が 2 倍になると、線形化された画像の強度値が 2 倍になります。)
画像入力は既に (十分に) 線形化されている可能性があります -> パート 2 にスキップできます。コンテンツがカメラから取得され、JPEG である場合、これはほとんど当てはまりません。
この問題の真の「解決策」は、カメラの応答関数を見つけることです。これを反転して画像データに適用し、線形強度値を取得します。これは決して簡単な作業ではありません。EMoRモデルは、あらゆる種類のソフトウェア (Photoshop、PTGui、Photomatix など) でカメラ応答関数を記述するために広く使用されています。この問題を解決するいくつかのオープン ソース ソフトウェア (ただし、別のモデル iirc を使用) はPFS calibrationです。
そうは言っても、単純な逆ガンマの適用で済むかもしれません。適切なガンマ値の大まかな「推測」は、次のようにして見つけることができます。
- eとe/2の 2つの露出時間で均一に照らされた静的なシーンをキャプチャする
- 両方の画像にいくつかの逆ガンマ変換を適用します (たとえば、0.1 ステップで 1.8 から 2.4 に)。
- すべての短時間露光画像に 2.0 を掛けて、それぞれの長時間露光画像から差し引きます
- 全体的な差が最小になるガンマを選択する
2. ストップ単位での照射の実際の差、すなわち log2(scale factor) を見つけます。
シーンが静的である (移動するオブジェクトやカメラがない) と仮定すると、これは比較的簡単です。
sum1 = sum2 = 0
foreach pixel pair (p1,p2) from the two images:
if p1 or p2 is close to 0 or 255:
skip this pair
sum1 += p1 and sum2 += p2
return log2(sum1 / sum2)
大きな画像では、画像をサブサンプリングすると、これは確かに同様に機能し、はるかに高速になります。
カメラが静止していてもシーンが静止していない場合 (オブジェクトが動いている場合)、これはうまく機能しなくなります。この場合、上記の手順を数回繰り返すだけで許容できる結果が得られ、前回の実行の出力を正しい倍率の推定値として使用し、商が現在の推定値から離れすぎているピクセル ペアを破棄しました。したがって、基本的に上記のif
行を次のように置き換えます。
if <see above> or if abs(log2(p1/p2) - estimate) > 0.5:
一定回数の繰り返しの後、または 2 つの連続した推定値が互いに十分に近い場合は、繰り返しを停止します。
編集:輝度への変換に関する注意
それを行う必要はまったくありません(Tony Dがすでに述べたように)。もしあなたが主張する場合は、線形化ステップの後に行います(Mark Ransomが指摘したように)。完璧な設定 (静的シーン、ノイズなし、デモザイクなし、量子化なし) では、すべてのピクセルのすべてのチャネルが同じ比率になりますp1/p2
(どちらも飽和していない場合)。したがって、異なるチャネルの相対的な重み付けは関係ありません。すべてのピクセル/チャネルを合計する (R、G、B を均等に重み付けする) か、緑のチャネルのみを使用することができます。