ブレンド処理により写真の画質を向上させるEnfuse

 風景を撮影する場合に同じアングルで露出を変えた一連の写真を撮っておくと、ハイライトと陰影のバランスの取れた1枚の写真に合成することが可能である。従来こうした処理を行うにはQtpfsguiなどのトーンマッピング型アプリケーションを使うのが主流であったが、トーンマッピングは処理終了までの時間が長く、使いこなしも難しく、不自然な結果を生じさせる場合もあるという欠点を有している。これらと対照的に、取り扱いが簡単で、処理も速く、得られる結果も優れているのが Enfuse という新規に登場したツールである。

 Enfuseは、これまでパノラマ写真合成用アプリケーションのHuginおよびEnblendに携わっていた開発者達が集まって最近立ち上げられたばかりのプロジェクトである。位置付け的にはEnblendパッケージの一部という扱いだが、Linux用の安定版はまだリリースされていない。WindowsおよびMac OS X用のEnblendであればコンパイル済みのベータ版をpanospace.wordpress.comからダウンロードできるが、Linuxユーザの場合はこのページからリンクされている指示に従って自力でコンパイルする必要がある。このコンパイルそのものは短時間で終わる作業であり、必要な依存ファイルを事前にインストールしておく以外、特に手間のかかる点もないはずだ。

 インストールが正常に終了するとenfuseという名前のバイナリが作成されているはずである。その実行用の構文は単純で、「enfuse -o outputfilename.jpg inputfile_1.jpg inputfile_2.jpg inputfile_3.jpg ...」というように、出力ファイル名の後ろに、入力対象のイメージを列挙するだけである(ワイルドカードによる一括指定も使用可能)。デフォルト設定下のEnfuseでは、多少冗長なステータスメッセージが出力されるようになっているが、どのようなアルゴリズム処理が実施されているかを雰囲気だけでも味わうのにはこうした仕様もいいかもしれない。なお処理された結果を確認するには、ユーザが好みの画像ビュワーを別途立ち上げる必要がある。

enfuse1_thumb.jpg
露出の異なる一連の画像(入力ファイル群)。暗い画像のほうがスクリーン上のテキストが識別しやすい

 ここでは具体的な操作法を解説するための素材として、私の作業机の一隅を撮影した一連のスナップショットを用意した。各フレーム中にはパソコンのモニタおよびカメラに向けたLEDライトが写されており、前景部と背景部を見ると、照明を反射している部分および光の陰となっている部分がいくつか存在しているのが分かるはずだ。

 これらのイメージ群に対して、入力イメージの処理法を調整するコマンドラインスイッチを指定することなくデフォルト状態のEnfuseを実行させたところ、私の環境では4秒と待たされることなく処理結果のイメージが出力された。これに比べてQtpfsguiによるトーンマッピングでは、処理結果のイメージを出力するのに20秒以上を要している。また私個人の主観的な判断ではあるが、Qtpfsguiではアルゴリズム設定を微調整したにもかかわらず、その最良の結果のものを選んでも品質的にはEnfuseのものより劣っているよう感じられる。

enfuse2_thumb.jpg enfuse3_thumb.jpg
Enfuseによる処理結果(パラメータ調整なし) Qtpfsguiによる処理結果(パラメータ調整した複数の結果から最良のものを選択)

Enfuseによる画像処理の基本原理

 Enfuseが行うのは、指定された入力イメージ群をexposure fusionと呼ばれるプロセスを用いて1つに融合する処理であり、このアルゴリズムでは入力イメージの各ピクセルについて、コントラスト、彩度(サチュレーション)、“露出の適性度”を評価したスコア付けをするようになっている。つまり、実行時に指定されたイメージ群は最終的に1枚に統合されるのだが、その際にスコアを基にしたピクセル単位での重み付けが個々の入力イメージに施されるのである。

 この処理によって画質が向上する理由は、先に挙げた3つの評価基準において、露出が過剰ないし不足した部分については低い評価が与えられるようになっているためである。つまり露出過剰の部分は白が強調され過ぎているので、こうしたホワイト部はコントラストおよび彩度の要素としては寄与させないようにし、逆に露出不足の部分は暗くなり過ぎているので、こちらのブラック部もコントラストおよび彩度の要素としては寄与しないように評価をさせる。またここで言う“露出の適性度”(well-exposedness)とは、0または1に近すぎないか(つまり純粋なブラックかホワイトでないか)をアルゴリズム的に判断することである。

 実際のアルゴリズムはこうした基本概念に改良を加えたものとなっており、複数のカラーチャンネルへの対応や、シャープエッジで発生する問題の対処策などが追加されている。なおpanotools.org wikiにあるEnfuseのページには、この理論を最初に提唱した論文へのリンクが張られているが、論文といっても簡単に読みこなせる英文で書かれているので、興味のある人間は一読してみてもいいだろう。

 読者の中には、ここまでのアルゴリズムに関する説明において、ソースとなる画像について触れられていないことに気づかれた方がおられるかもしれない。実はEnfuseの処理が高速なのは、そこに秘訣があるのである。これまでの主流であったハイダイナミックレンジ(HDR:High Dynamic Range)ベースのトーンマッピングの場合は、指定された複数の入力イメージを統合してオリジナルの風景を再現する作業で始まるが、通常その際にはEXIFタグに記録された露出情報を基にして入力イメージ群を明暗順で並べ替えるという処理が必要となる。つまりHDRイメージが最終的なTIFFやJPEGなどの通常フォーマットにトーンマッピングされるのは、こうした処理を経た後になるのである。

 ところがexposure fusionの場合、こうした予備的な処理はいっさい必要としない。その代わりにこちらの方式では、各イメージを構成するピクセル単位にてその有効性のランク付けをするという処理が用いられている。

ユーザによる微調整

 当然ながらデフォルト設定下のEnfuseによる重み付けのままでは望ましい結果が得られないこともある。彩度が低すぎるイメージが指定されていたり、そもそもが完全なホワイトないしブラックに近い色合いとして再現されるべきオブジェクトが写っていると、スコア付けが上手く行かない可能性があるからだ。こうしたケースについては、重み付けの方式を調整させるスイッチがコマンドラインにて指定できるようになっている。

 スコア付けをする各要因については–wスイッチにて個々の相対的な重要度を0から1のスケールにて指定することが可能であり、具体的には「--wContrast=x --wSaturation=y --wExposure=z 」という構文を用いてコントラスト、彩度、“露出の適性度”を個別指定すればいい。もっとも、どのような指定値がどのような結果をもたらすかは試行錯誤的に体得するしかないだろうが、それでもこの方式の処理が高速である点は大きなメリットとなるはずである。

 なおEnfuseには、ブレンドのレベル、コントラスト解析、出力のスケーリング、メモリの割り当てなど各種の調整用スイッチも用意されているが、これらの詳細はmanページを参照して頂きたい。

 その他にもEnfuseは、被写界深度を変えて撮影したイメージ群をブレンドして前景部と背景部の双方にピントがあった画像を合成するという使い方もできる。こうした処理は、ライティングの都合で被写界深度の浅い写真しか撮影できないような場合に役立つはずだ。いずれにせよユーザの意図したピクセルを強調させる重み付けを行わせるには、手作業による–wスイッチでの調整にある程度熟練しておく必要がある。

 HDRトーンマッピングについては、期待したほどの結果が得られなかったというコメントをよく目にする。そうした批判のあるトーンマッピングではあるが、用いるアルゴリズムを変えたり各種の設定を適用することでどのような効果が得られるかを時間を掛けて試してみたいというユーザであれば、この手法により様々な創造性を発揮できるはずだ。そうではなく、ダイナミックレンジが広く見栄えのいい通常画質のイメージを結果的に入手したいというユーザであれば、Enfuseの方が優れたオプションということになる。

Linux.com 原文