【CG】OpenCVにあるHDR合成×トーンマップの全組み合わせを試す【C++】
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はカメラを応答関数はなくても一応処理はできます。
が作れますね。
2.トーンマップのアルゴリズム
今回はデフォルト設定でやります。こちらもやらないという選択肢があるので、計5つ。ということは、
が作れますね。
3.入力画像
次の4枚にしました。-4、-2、0、+2です。場所は富山県立美術館の2階。
個人的な経験則ですが、OpenCVで重み付けをせずにデフォルト値でやるときは、-4~+4とかでやるよりも、入力画像にちょっと暗い画像を多くしておくと上手くいきやすいです。
|
|
|
|
これを入力情報ファイルのlist.txtにシャッタースピードとともに書いておきます。
room-4.jpg 30
room-2.jpg 125
room0.jpg 500
room+2.jpg 2000
room+4.jpg 8000
あとはOpenCVライブラリにあるサンプルソースをちょっと改造したプログラムを用意します。じゃあやってみましょう。(ソースは最後に載せています。)
出力結果
応答関数ですが、Debevec、Robertson、なしの3つともほぼ同じ結果がでたので、Debevecだけ載せます。
1.カメラ応答関数:Debevec
HDR合成 | ||||
Debevec | Robertson | Mertens | ||
ト | ン マ ッ プ |
Durand | ![]() |
![]() |
![]() |
---|---|---|---|---|
Drago | ![]() |
![]() |
![]() |
|
Reinhard | ![]() |
![]() |
![]() |
|
Mantiuk | ![]() |
![]() |
![]() |
|
なし | ![]() |
![]() |
![]() |
考察
一番右下のHDR合成=Mertens、トーンマップ=なしが一番期待していた絵に近いでしょうか。
いろいろな画像で試してみましたが、この傾向は変わりませんでした。応答関数は今回はなくても問題はありませんでしたが、画によっては関数を指示したほうがいい結果が得られるかもしれませんので、やったほうが良さそう。
HDR合成=Mertens、トーンマップ=なし |
|
![]() ![]() |
![]() ![]() ![]() |
おまけ:ソース
こんなふうにしてみました。あげます。
・外部定義ファイル
list.txtというファイルを外部に用意します。
1行に2つのデータを記入する。1つ目はファイル名、2つ目はシャッタースピード。
シャッタースピードを定義するので、V-RayとかのCG画像に対してもHDR処理が正確に行えますね。