GPUでHDR画像を処理できるCVL

 グラフィックス・プロセッシング・ユニット(Graphics Processing Unit:GPU)を搭載したデスクトップPCなら、CVLライブラリを使って高度な画像処理を行うことができる。CVLには、画像ビューアとトーンマッパー、それに画像処理用の非対話的なコマンドラインツールが含まれる。

 CVLは、3つのツールで構成されている。PFSファイルを対象とした画像ビューアであるCVLView、ハイダイナイックレンジ(High Dynamic Range:HDR)画像を手軽に扱うためのCVLTonemap、そして画像の変換、色調補正、ブレンディング、フィルタリングが行えるcvtoolである。これらのツールは、GPUの処理能力を活かすことで、トーンマッピングの変更をほぼリアルタイムで適用できる。なお、各ツールを使うには、NVIDIAのGeForce 6シリーズ以降のグラフィックスカードが必要になる。

 通常、HDR画像にはディスプレイ機器で表示できる以上の色情報が含まれる。具体的にいうと、従来の“低ダイナミックレンジ”(LDR:Low Dynamic Range)形式が赤、緑、青に8ビットずつで合計24ビットを使用するのに対し、HDR画像は32ビットの浮動小数点数に基づいて表現されている。トーンマッピング・ソフトウェアの役割は、PC用液晶モニタのようなLDR方式のディスプレイでHDR画像をうまく表示できるようにすることだ。

 HDR画像を作成する方法の1つは、デジタルカメラを三脚に固定し、カメラの露出ブラケット機能を使って、まったく同じ構図を異なる露出設定で撮影することである。こうして得られた複数枚の写真は、fotoxxのようなツールを使うことで1枚のHDR画像に合成できる。

 前述のとおり、CVLはCVLView、CVLTonemap、cvtoolの3つのプログラムで構成される。最初の2つはQt 4.2以降を使ったGUIツール、残る1つはコマンドラインツールだ。3つのプログラムはいずれもPFSという画像形式を使用するため、CVLのツールを使うにはpfstoolsをインストールしておく必要がある。PFSは、単純かつ汎用的なHDR画像のフォーマットだと説明されているが、私にはそれが何かの略語なのか、あるいはファイル拡張子に使われる3つの文字の羅列なのかはわからなかった。なお、cvtoolとCVLViewでは、netpbm形式もネイティブで処理できる。

 pfstoolsパッケージを使えば、PFS以外の画像の読み書きや、そうした画像とPFSとの相互変換が可能になる。pfstoolsのFAQによれば、PFSは圧縮フォーマットではなく、各種アプリケーションとの画像データの受け渡しが容易に行えるように作られているという。以下は、HDR画像ファイルを読み込んでPFSファイルに変換したうえで、cvtoolに渡してガウス(ブラー)効果を適用し、その結果をPNG画像として保存するコマンドの例だ。

pfsin foo.hdr | cvtool gauss --sigma=1.2 | pfsout bar.png

 GUIアプリケーションであるCVLTonemapは、上記コマンドのようなパイプライン処理では使えない。だが、CVLTonemapは、pfstoolsがインストール済みで利用可能な場合には自動的にpfstoolsを利用しようとする。その場合は「ファイルを開く/保存する」ダイアログからPFS形式以外の画像を読み込んだり、内部でpfstoolsを利用することでそうした画像を処理したりできるようになる。

 pfstoolsは、openSUSE 11の1-Clickインストールに対応し、Debianのlennyおよびsidの各リポジトリにも入っているが、Fedora用のパッケージはない。一方のCVLライブラリは、openSUSE、Debian、Fedoraのいずれの標準リポジトリにもパッケージが存在しいない。今回はpfstools、CVLともに、Intel Core 2 Quad Q6600 CPUとNVIDIA GeForce 7900 GSグラフィックスカードを搭載した64ビット版Fedora 9マシンでソースからインストールを行った。具体的なバージョンは、cvlviewが0.31、cvltonemapが0.2.2、cvtoolが0.2.5、pfstoolsが1.6.5である。なお、CVLスイートにはQt 4.2以降とglewライブラリが必要であり、glewはFedora、openSUSE、Debian向けにパッケージ化されている。

 pfstoolsのインストールは、標準的な「./configure; make; sudo make install」の手順に従って行う。ただ、configure実行時の最後の出力には注意しておくとよい。pfstoolsによって検出された画像処理ライブラリが表示され、JPEG-HDRおよびOpenEXRの画像ファイルを処理できるかどうかがわかるからだ。

 CVLのほうは3つのtarballに分かれており、それぞれについて標準の手順「./configure; make; sudo make install」を実行する。ただし、CVLViewおよびCVLTonemapをビルドするより先にcvtoolをインストールしておく必要がある。私の環境では、CVLViewのコンパイル時に以下のようなエラーが出た。このエラーを回避するには、gllib/glvm.hファイルの先頭に「#include <limits>」という行を追加すればよい。

In file included from arcball.cpp:24:
glvm.h:1192: error: 'numeric_limits' is not a member of 'std'
...

cvl1_thumb.jpg
CVLViewの3D Viewモード

 CVLViewは「pfsファイルに保存された任意の浮動小数点数データを扱えるビューア」と説明されているとおり、画像処理のツールではない。早速、CVLViewを使ってそのホームページにあるサンプルファイルを読み込んだところ、いくつか問題が発生した。1つは、サイドバーのパネルがどれも小さすぎてそれぞれのペインの内容を表示しきれなかったことだ。これは、あとになって私のテーマ設定とKDE 4の問題だとわかった。CVLViewを(テーマが設定されていない)別のユーザで実行すると、どの表示もサイドパネル内に十分に収まっていたからだ。

サンプル画像について
 このナンシーの大聖堂の画像は、Max-Planck-Institut für Informatik(MPII)のHDR画像ギャラリーにあるもので、その著作権はRafal Mantiuk氏に帰属する(Copyright © 2004 by Rafal Mantiuk)。ここでは、ツールの動作確認を目的として同ギャラリーのページに記載された「自由なダウンロードおよび使用」条件の下で使用した。この画像にはJPEGバージョンOpenEXR形式のHDRバージョンがあるが、ここで使っているのは、OpenEXRバージョンを「pfsinexr nancy_cathedral_2.exr >|nancy_cathedral_2.pfs」コマンドによってPFS形式に変換したものである。

 また、HDR画像の読み込み時には「Range Selection」が黒しか表示されないような設定になるようで、データ値が含まれる(つまり、画像を形成する)領域にフォーカスを当てるためには、手動で範囲を調整する必要がある。「3D View」モードでは、ディスプレイに表示しきれない画素値を表すために3次元表示が使用される。左のスクリーンショットにあるナンシーの大聖堂のサンプル画像では、窓から差し込む光の部分がこの画像の表示に使用されている色の範囲よりもさらに明るいため、それらの値が、ここで表示対象として選択されている画素値の範囲をどれだけ超えているかが、奥に見える画像の平面からの距離として表されている。

 画像をクリックすると、ドラッグによる移動やマウスホイールによるスクロールが可能になる。表示の拡大/縮小も直ちに行われる。「3D View」モードでは、マウスの右ボタンを押したまま画像の3次元表示を回転させることで、選択されている画素値の範囲に収まらない部分を確認できる。

cvl2_thumb.jpg
CVLTonemap

 また、CVLTonemapを使えば、画面に表示される色の範囲を変更できる。しかも、ほとんどの変更はリアルタイムに反映される。それでも、L Durand 02のようなより高度なトーンマッピング手法を使うと、スライダを操作してから画像が更新されるまでのタイムラグが大きくなる。ただし、今回使ったグラフィックスカードはShader Model 4をサポートしているGeForce 8シリーズではなく、Shader Model 3対応のものである。

 CVLViewで先ほどのnancy_cathedral_2の画像を開いたまま、同じファイルをCVLTonemapで開こうとすると「invalid framebuffer operation」というエラーが出たので、いったんどちらのツールも閉じたうえでCVLTonemapだけを起動してこのファイルを読み込むと、今度は問題なく表示された。この画像を双方のプログラムで同時に開くには、グラフィックスカードのメモリが足りないようだ。

 さらに、コマンドラインツールのcvtoolを使えば、画像に対するさまざまな操作を非対話的に実行できる。cvtoolのマニュアルページは、CVLViewやCVLTonemapと同様、非常にそっけない内容だが、Webサイトのドキュメントにはもう少し詳しい説明がある。このツールは「cvtool コマンド オプション群 < input.pfs > output.pfs」という形式で実行する。以下に、画像を元のサイズの5分の1に縮小する例を示す。詳しい情報(ドキュメントには記載されていない有効な値など)は「cvtool help コマンド 」によって得られる。

$ cvtool scale --factor 0.2  \
   --interpolation=bicubic-b-spline  \
   < nancy_cathedral_2.pfs \
   > nancy_cathedral_2_small.pfs

$ cvtool help scale
cvtool: [REQ] help: scale [-w|--width=<width>] [-h|--height=<height>]
cvtool: [REQ] help: [-i|--interpolation=none|bilinear|biquadratic|bicubic|bicubic-b-spline|bicubic-cr-spline]
cvtool: [REQ] help: scale -x|--factor-x=<factor-x> -y|--factor-y=<factor-y>
cvtool: [REQ] help: [-i|--interpolation=none|bilinear|biquadratic|bicubic|bicubic-b-spline|bicubic-cr-spline]
cvtool: [REQ] help: scale -f|--factor=<factor>
cvtool: [REQ] help: [-i|--interpolation=none|bilinear|biquadratic|bicubic|bicubic-b-spline|bicubic-cr-spline]
cvtool: [REQ] help:
cvtool: [REQ] help: Scale frames to new size. The default interpolation type is
cvtool: [REQ] help: bilinear.
cvtool: [REQ] help: First form: Give new width and/or height. If one value is
cvtool: [REQ] help: missing, it is computed from the other so that the aspect
cvtool: [REQ] help: ratio remains the same.
cvtool: [REQ] help: Second form: Give scale factors for width and height.
cvtool: [REQ] help: Third form: Give one scale factor for both width and height.

 従来のディスプレイで表現できる以上の豊かな色情報を持った画像を、表示の設定を変えながらリアルタイムでレンダリングできる点はすばらしい。露出ブラケット機能を利用した撮影やHDR画像の作成を考えている人は、ぜひCVLTonemapをインストールしておくとよい。CVLTonemapでは、トーンマッピングのアルゴリズムを選択できるだけでなく、シャープネスや色飽和度など、さまざまな設定項目の変更結果をほぼリアルタイムで確認できる(計算量の多いアルゴリズムの場合はもう少し時間がかかり、処理に要する時間は画像のサイズやマシンの性能にも依存する)。こうしたトーンマッピングのアルゴリズムや各種パラメータの効果の詳細については、書籍『High Dynamic Range Imaging: Acquisition, Display and Image-Based Lighting』を参照してほしい。

Ben Martinは10年以上前からファイルシステムに携わっている。博士号を持ち、現在はlibferris、各種ファイルシステム、検索ソリューションを中心としたコンサルティング業務に従事。

Linux.com 原文(2008年8月26日)