![]() |
OpenCV 5.0.0
Open Source Computer Vision
|
次のチュートリアル: 高レベルなスティッチングAPI (Stitcherクラス)
| 原著者 | Fedor Morozov |
| 互換性 | OpenCV >= 3.0 |
今日のデジタル画像や撮像機器の多くは、チャンネルあたり8ビットを使用しており、機器のダイナミックレンジを2桁(実際には256階調)に制限している。一方、人間の目は10桁にわたって変化する照明条件に適応できる。実世界のシーンを撮影すると、明るい領域は露出オーバーになり、暗い領域は露出アンダーになることがあり、単一の露出ではすべてのディテールを捉えることができない。HDRイメージングは、チャンネルあたり8ビットを超える(通常は32ビット浮動小数点値)画像を扱い、はるかに広いダイナミックレンジを可能にする。
HDR画像を得る方法はいくつかあるが、最も一般的なのは、異なる露出値で撮影したシーンの写真を使う方法である。これらの露出を合成するには、カメラのレスポンス関数を知っておくと便利であり、それを推定するアルゴリズムも存在する。HDR画像を合成した後は、通常のディスプレイで表示するために8ビットへ変換し直す必要がある。この処理をトーンマッピングと呼ぶ。シーン内の物体やカメラが撮影間で動く場合、異なる露出の画像を位置合わせ・アライメントする必要があるため、さらに複雑になる。
このチュートリアルでは、露出シーケンスからHDR画像を生成して表示する方法を示す。ここでは画像はすでにアライメントされており、動く物体もない。また、低ダイナミックレンジの画像を生成する露出合成 (exposure fusion) という別のアプローチも紹介する。HDRパイプラインの各ステップは異なるアルゴリズムで実装できるため、それらすべてを確認するにはリファレンスマニュアルを参照してほしい。
画像・露光時間・list.txt ファイルを含むデータディレクトリはここからダウンロードできる。
まず、ユーザーが指定したフォルダから入力画像と露出時間を読み込む。フォルダには画像と、ファイル名および露出時間の逆数を含むファイル list.txt が入っている必要がある。
今回の画像シーケンスでは、リストは次のようになっている:
多くのHDR構築アルゴリズムでは、カメラレスポンス関数 (CRF) を知ることが必要である。ここではキャリブレーションアルゴリズムの1つを使い、256個すべてのピクセル値に対する逆CRFを推定する。
前項で計算したレスポンスを用いて、Debevecの重み付け方式によりHDR画像を構築する。
一般的なLDRディスプレイで結果を見たいので、HDR画像を可能な限りディテールを保ったまま8ビットの範囲にマッピングする必要がある。これがトーンマッピング手法の主目的である。ここではバイラテラルフィルタリングを用いたトーンマッパーを使い、ガンマ補正の値として2.2を設定する。
HDR画像が必要ない場合に、露出を合成する別の方法がある。この処理は露出合成 (exposure fusion) と呼ばれ、ガンマ補正を必要としないLDR画像を生成する。また、写真の露出値も使用しない。
いよいよ結果を見るときである。HDR画像は一般的な画像フォーマットには保存できないため、Radiance画像 (.hdr) として保存する点に注意。また、すべてのHDRイメージング関数は結果を [0, 1] の範囲で返すため、結果に255を掛ける必要がある。
他のトーンマップアルゴリズム、cv::TonemapDrago、cv::TonemapMantiuk、cv::TonemapReinhard を試すこともできる。また、自分の写真に合わせてHDRキャリブレーションやトーンマップ手法のパラメータを調整することもできる。