【CG】OpenCVにあるHDR合成×トーンマップの全組み合わせを試す【C/C++】

Pocket
email this

 OpenCVに直接触れる機会がなかなかなかったのですが、HDR合成機能を試してみたかったのでやってみました。

 早速。公式のサンプルに毛が生えただけのコードですが一通り作成してみます。


OpenCVにあるHDR機能あれこれ

HDRキャリブレーション

2つありました。以後「カメラ応答関数」と呼んでいます。
(用語を完璧に覚えていなくてごめんなさい。復習+勉強中です。)

  • Debevec(デベベック)
  • Robertson(ロバートソン)

HDR合成

3つ方法がありました。

  • Debevec(デベベック)
  • Robertson(ロバートソン)
  • Mertens(マーテンズ)

トーンマップ

4つアルゴリズムがありました。

  • Durand(デュラン)
  • Drago(ドラゴ)
  • Reinhard(ラインハルト)
  • Mantiuk()

あと「トーンマップ処理しない」って選択肢もあります。HDR合成して32bitにしてから8bitに戻すだけ。という選択肢もある。

 このへんまで読んだ時点で、これ、プログラミングできる人だったらPhotomatixほぼ要らないってことになりますよね。それは言い過ぎだったか・・・Luminance HDRと同等の加工はできると言ったほうがいいか、訂正します。自分でコーディングしてスライダとかプレビュのUIつければいけちゃう。作るより買ったほうが絶対安いけどいい勉強にはなるかと。


実行

1.HDR合成処理とカメラ応答関数

HDR合成時にカメラ応答関数を指示します。ただしOpenCVはカメラを応答関数はなくても一応処理はできます。

HDR合成処理3つ × カメラ応答関数3つ = 9通りのHDR合成画像

が作れますね。

2.トーンマップのアルゴリズム

今回はデフォルト設定でやります。こちらもやらないという選択肢があるので、計5つ。ということは、

9通りのHDR × トーンマップ5つ = 45通りの画像

が作れますね。


3.入力画像

次の4枚にしました。-4、-2、0、+2です。場所は富山県立美術館の2階。
個人的な経験則ですが、OpenCVで重み付けをせずにデフォルト値でやるときは、-4~+4とかでやるよりも、入力画像にちょっと暗い画像を多くしておくと上手くいきやすいです。

-4
-2
0
+2
           

これを入力情報ファイルのlist.txtにシャッタースピードとともに書いておきます。

 あとはOpenCVライブラリにあるサンプルソースをちょっと改造したプログラムを用意します。じゃあやってみましょう。(ソースは最後に載せています。)


出力結果

応答関数ですが、Debevec、Robertson、なしの3つともほぼ同じ結果がでたので、Debevecだけ載せます。

1.カメラ応答関数:Debevec

HDR合成
Debevec Robertson Mertens





Durand
Drago
Reinhard
Mantiuk
なし

考察

 一番右下のHDR合成=Mertens、トーンマップ=なしが一番期待していた絵に近いでしょうか。
 いろいろな画像で試してみましたが、この傾向は変わりませんでした。応答関数は今回はなくても問題はありませんでしたが、画によっては関数を指示したほうがいい結果が得られるかもしれませんので、やったほうが良さそう。

通常
 
HDR
HDR合成=Mertens、トーンマップ=なし
     



おまけ:ソース

 こんなふうにしてみました。あげます。

・外部定義ファイル
 list.txtというファイルを外部に用意します。
 1行に2つのデータを記入する。1つ目はファイル名、2つ目はシャッタースピード。
 シャッタースピードを定義するので、V-RayとかのCG画像に対してもHDR処理が正確に行えますね。

・ソース



参考サイト


コメントを残す