2012年10月18日

高精度・高色深度なGIMP

ここでは2012/10/18現在の最新の開発版GIMP-2.9について取り上げます。
GIMPの開発者は、GIMP内部のデータの取り扱いを徐々にGEGLに置き換えていく作業を行っています。GIMP-2.8にもGEGL移行作業が行われていましたが、GIMP-2.10ではGEGLへの移行を完了させるプランになっています。
GIMP内部がGEGL化したことにより、開発版GIMPではこれまでよりも高精度なピクセル処理を行えるようになりました。

GIMP-2.9ではついに8bit/channelだけでなく、それ以上の精度のカラーを利用できるようになりました。
1チャンネルあたり8bitというのは、RGBの各要素について例えば赤チャンネルは0〜255までの256の諧調で表現していました。赤、青、緑、それぞれの要素で256階調なので表現可能なカラーは 256*256*256 = 1677216色 です。

これがどうなったかというと、次の5つの中から選ぶことができるようになりました。
  • 8ビット整数 (従来の方式)
  • 16ビット整数
  • 32ビット整数
  • 16ビット浮動小数点
  • 32ビット浮動小数点

gimp29-precision1.png

精度が変われば何が変わるかといえば、簡単に言えば演算した結果の誤差が減少します。
そして誤差が含まれたまま演算を何回も繰り返し行うと、誤差が累積していき正しい結果からどんどん離れていきます。
つまり、色情報が失われるような過酷な処理を何回も行う場合、8ビットの場合と比較したときに色情報の損失が抑えられるということです。


実際に2012/10/18のGIMPを使って試してみます。
違いがよく分かるように、カラー画像ではなくモノクロ画像で調べます。

初期状態
8ビット精度のグレースケールモードと、32ビット浮動小数点精度のグレースケールモードの二つの画像を用意しました。
ともに画像の大きさは640*480で、x軸の0→639座標に対して黒から白色の線形グラデーション(ディザリングなし)をしてあります。


gimp29-precision32_all0.png

これに対し、毎回レベルツールを使います。
ガンマの適用量は毎回3.14と一定です。
なお、画像は左側が8ビット整数、右側が32ビット浮動小数点のときの状態です。

レベルツール 適用1回目
gimp29-precision8_level1.png gimp29-precision32_level1.png

レベルツール 適用1回目の結果画像
gimp29-precision8_all1.png gimp29-precision32_all1.png

レベルツール 適用2回目
gimp29-precision8_level2.png gimp29-precision32_level2.png

レベルツール 適用2回目の結果画像
gimp29-precision8_all2.png gimp29-precision32_all2.png

レベルツール 適用3回目
gimp29-precision8_level3.png gimp29-precision32_level3.png

レベルツール 適用3回目の結果画像
gimp29-precision8_all3.png gimp29-precision32_all3.png

レベルツール 適用3回目の結果画像 (画像の左側を拡大)
gimp29-precision8_all3zoom.png gimp29-precision32_all3zoom.png

レベルツール 適用4回目
gimp29-precision8_level4.png gimp29-precision32_level4.png

レベルツール 適用4回目の結果画像
gimp29-precision8_all4.png gimp29-precision32_all4.png

レベルツール 適用4回目の結果画像 (左側を拡大)
gimp29-precision8_all4zoom.png gimp29-precision32_all4zoom.png

これだと処理結果を比較して観察することが難しいと思います。
そこで、左端の拡大画像を8ビットと32ビット浮動小数点とで並べて表示したものがこれです。

レベルツール適用3回後の拡大画像の比較
gimp29-precision8-32_3.png

レベルツール適用4回後の拡大画像の比較
gimp29-precision8-32_4.png

まず、横幅640の画像に対してブレンドツールを使用しています。このとき、8bit整数ならば640ピクセルに対して256段階の(モノクロ)色をつけているのに対し、32bit浮動小数点はより多段階の色をつけています。
ブレンドツール使用直後の画像では目に見えた違いは出にくいですが、その次のレベルツールを適用するごとに精度の違いが徐々に浮き彫りになってきています。

32ビット浮動小数点の画像のほうがグレーの諧調が細かく残っている様子が分かります。
一番左側の黒のエリアの太さが違っているのは、初期のブレンドツールの精度の違いがレベルツールによってあらわになったものだと思われます。
処理途中のレベルツールにも注目してください。レベルツールダイアログの中のヒストグラムをよく見ると、8ビット側にはトーンジャンプが発生しています。精度の不足から情報データの欠損が起こっているのです。


今回の比較検証の結果をどう受け止めるかは人それぞれでしょう。
「見た目にはたいした差はないね」
「データの欠損が抑えられるのはいいな」
もしかしたら、私の検証方法が不適切だったのかもしれません。もっと適切な、違いが分かる方法があれば教えて下さい。



現在、開発版GIMPでは、GIMP内部で取り扱うデータ精度を8bit以外にも変えられるようになったため、GIMP付属のプラグインやフィルター、file-load/saveもこれに対応したものに変えるための修正作業中です。GIMPには大量のプラグインが付属しているので、すべて修正が終わるにはまだ時間がかかるものと思われます。
いくつかの基本的なフィルター(ぼかしなど)は従来から利用していたGIMPのものではなく、GEGLのオペレーションを使うようになっています。GIMPのプラグインがGEGLのオペレーションの一つになって、GIMPがそのオペレーションを使うようになったケースもあります。

また、高レベルな色深度から低レベルな色深度に変換するときにgegl:color-reductionを使ってディザリングを使うオプションも実装されたようです。

これまでもGIMPはGEGLへの統合を進めてきましたが、ここにきて高精度なGIMPという、GIMPのGEGL化への本格的な目に見える恩恵が出てきたと思います。
しかしながら私のPC環境のためなのか不明ですが、GIMPのGEGL化した処理がこれまでの同処理と比べて「もっさりと」「なんとなく重い」と感じます。
軽快なGIMPを利用するならこれまでのバージョンを併用するほうが良いでしょう。

また、1チャンネルの表現データ量が8bit→32bitに増加した結果、画像を編集するときに消費するメモリの量がほぼ4倍になっています。(レベルツール適用4回後の拡大画像の比較)を参照してみてください。
何枚もレイヤーを扱うほど必要メモリが増えます。アンドゥ履歴でも履歴をキープしておくためのメモリが必要です。それが、ほぼ4倍。
PCに搭載されているメモリーの量やGIMPの使用状況によっては、これまでよりも早くメモリ不足の状態に陥ることでしょう。
この点も高精度GIMPのデメリットになります。





別件ですが、Elle Stone氏がLittleCMS v2を利用したカラーマネジメントプラグイン(フィルター)を作りました。
8 bit integer, 16 bit integer, 32-bit floating point間の変換をサポートしているようです。まだ未完成だそうで、完成したらGIMP本体に取り込まれるのかな。
→ Gimp lcm2
posted by いっちー at 23:11| Comment(1) | Gimp-2.9 | 更新情報をチェックする
この記事へのコメント
8-bits channelと16-bits channel の違いは地形データをグレイスケールとしてヘイトマップ(標高マップ)で取り込んだときに如実に表れます。
8-bitsでは地形が地図の等高線で表現したような階段状になります。
16-bits channel ではそれ程ではなくなだらかになります。
ですので、ゲームで使われているヘイトマップは16-bits channelで用いられているようです。
Posted by オ・ウェル at 2015年12月10日 16:16
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。