場所は分かりにくいが一応観光地になっていて、現状のところはかなり自由に探検できます。
少々危険な場所も立ち入れるので、すぐに管理者責任を問う日本の厄介な風潮ゆえ、今後有名になって訪問者が増えればいろいろトラブルを起こしてそのうち立ち入り制限などされるのではないかと思っています。
駐車スペースに停めて何の変哲もない山道を5分ほど歩くといきなり前方に巨大な建造物が現れる。

内部に入っても魚眼でなければ太刀打ちできない巨大さ。



太陽のフレアなど入れると果てしなくどこかの遺跡っぽい。


で、実はこれは本題ではなく…
折角ダイナミックレンジの大きい被写体なので、ここでブラケット撮影した写真をネタにOpenCV 3.0から実装されたHDR機能を試してみようというのが本題。
実は上の写真もすべてOpenCVのHDR機能を使って合成したものです。
HDRとは何ぞや…についてはここを参照。
OpenCV3.0のHDRの概要に関しては以下参照。紹介されている参考文献がとても勉強になる。
http://docs.opencv.org/master/d3/db7/tutorial_hdr_imaging.html
http://docs.opencv.org/3.0-beta/modules/photo/doc/hdr_imaging.html
市販のPhotomatixなどのソフトと比べると「いかにもHDR」というようなド派手な仕上がりにはならないが、適度に品良く合成してくれるという印象で、実戦でも十分使用できるのではないでしょうか。
しかもその気になればソースも公開されているので自分でカスタマイズなどもできてしまう。
通常、HDRはPhotomatixやHDR Proなどの専用ソフトで原理を知らなくても合成できてしまうので、動作原理の理解などはすっ飛ばしてしまうのだが、今回少しばかりHDR合成の理解を深めるよい機会となりました。
そもそも一般的にHDR写真と言われているものは厳密に言うと実はHDRではなく(現在のいかなる表示手段でもHDRをそのまま表示することはできない)合成されたHDRからモニターや印刷物で見られるようにLDR(Low Dynamic Range)に変換されたものであることも今回改めて知りました。
以下混乱のないように、表示できるように変換した画像をLDRと書きます。
その筋の専門家ではないので、誤って理解しているものもあるかも知れませんが…
大きく分けてメジャーなHDR合成手法は
・Tonemap
・Exposure Fusion
の2つに分かれるらしい。(たしかにPhotomatixでもこの2つの設定がある)
それぞれの手順は
Tonemapの場合
1. ブラケット撮影されたイメージシーケンスとそのcamera response function (CRF)を用意する。
CRFとは、通常ピクセル値と実際の照度(irradiance)は非線形なため、合成に適する線形に補正するためのLUTのようなもの。
CRFは通常カメラメーカーからは公開されていないので、OpenCVでは撮影されたイメージシーケンスとそのそれぞれのシャッタースピード(絞り・ISOは固定として)からCRFを推定する手法を採用しています。
2. 上のデータを元にHDR画像を合成する。ここで合成されたHDRは浮動小数点で表現されていてダイナミックレンジが非常に大きく、モニターなどで全貌を見ることはできない。
3. ここが一番肝の部分。出来上がったHDR画像から表示することが出来るLDR画像を合成する。これがTonemappingと呼ばれるもので、現在進行形でいろいろな手法が考案されつつある(らしい)。OpenCVでもDrago,Durand,Mantiuk,Reinhardの4つのアルゴリズムが組み込まれている。
要はHDR画像をそのまま線形にダイナミックレンジを狭くしてもコントラストのない実用的でない画像になってしまうため、コントラストを維持したままダイナミックレンジを256階調(16bitの場合は65536か…)に収める手法の総称がTonemappingと呼ばれている。(たぶん)
Exposure Fusionの場合
1. Tonemapとは異なり、HDR画像やCRFを介さずにイメージシーケンスから直接LDR画像を合成する。
与えられたイメージシーケンスのコントラスト・彩度・適正露出の3つのパラメータ+αの情報から判断してイメージシーケンスのうちの1枚から最適な部分を取り出しモンタージュして一枚のLDR画像を合成する。
以下、本家サイトのサンプルをベースに一連のアルゴリズムの合成結果を比較できるプログラムを作ってみました。
https://github.com/delphinus1024/opencv30hdr.git
Windowsでは何故かassertionエラーで不正終了してしまうので、Linux(Ubuntu)のみで動作確認しています。
使用したバージョンはOpenCV 3.0 RC1
準備として
1. exiv2 (画像ファイルのEXIF情報を取得・操作するオープンソースなソフト)をインストールしておく。
2. pkg-configをインストールしておく。
3. もちろんOpenCV 3.0をインストール。
4. ブラケット撮影されたイメージシーケンス。今回は1Ev刻みでブラケット撮影したものを使用。

ビルド方法は
上記すべてのファイルを同じディレクトリに置いて
make
で実行ファイルhdrができる。
実行方法は
1. まずイメージシーケンスとシャッタースピードの一覧を記述したlist.txtを作成する。
もちろん各イメージファイルにシャッタースピードのEXIF情報が含まれている必要がある。
イメージファイルの拡張子は.tifを想定。
python make_list.py [イメージシーケンスのあるディレクトリ名] >list.txt
でlist.txtが出来上がる。
list.txtの中身は以下のような感じで、ファイル名とシャッタースピード値が羅列されている。
7S4A9876.tif 1579.223836
7S4A9877.tif 789.611918
7S4A9878.tif 394.805959
7S4A9879.tif 197.402980
7S4A9880.tif 98.701490
7S4A9881.tif 49.350745
7S4A9882.tif 24.675372
7S4A9883.tif 12.337686
7S4A9884.tif 6.168843
7S4A9885.tif 3.084422
7S4A9886.tif 1.681793
7S4A9887.tif 0.771105
7S4A9888.tif 0.385553
7S4A9889.tif 0.192776
2. list.txtをイメージシーケンスと同じディレクトリに置く。
3. 以下のコマンドで起動
./hdr [イメージシーケンスのあるディレクトリ名]
処理が終わると各アルゴリズムで処理されたLDR画像(png)が生成される。
生成された画像はそのままではコントラストが低いので、適宜レベル調整してやると見られる画像になる。
それぞれのレベル調整後の結果は以下。
Tonemap系のアルゴリズムはすべてデフォルト設定で処理したのだが、比べて見てみるとコントラスト情報とそれ以外の情報を分離して処理しているDurandが細部まで綺麗に合成されていてコントラストも色もいい感じに保持されているように感じる。パラメータを変えてみるとまた異なる結果になるのかもしれないが、このあたりは未確認。
もちろんHDRはアート系以外に科学的・医学的にも使われる技術なので、美的判断だけがすべてではないのかも。
Mantiuk

Durand

Drago

Reinhard

Exposure Fusionは4種類の設定で出してみた。
デフォルト値の contrast_weight=1.0f, saturation_weight=1.0f, exposure_weight=0.0fで出したものが一番コントラストも彩度も派手に合成されるみたい。
(1.0, 1.0, 1.0)

(0.0, 1.0, 1.0)

(1.0, 0.0, 1.0)

(1.0, 1.0, 0.0)

いずれにしても、市販ソフトよりも自然な絵を出してくれる上に自分で詳細を弄れるので結構気に入りました。タダだし…
ただし、Photomatix系の派手派手な絵が好きな人には物足りないかもしれません。