前回、ガンマ補正理解メモ(3)で、次のように書きました。
「GIMPの場合は、画像処理のために、いったんリニアに戻して(ガンマ・デコード)計算をし、再度数値を非リニア(ガンマ・エンコード)に戻しているのは明らかです。あるいは計算はリニアの空間、そして表示だけ非リニアにしている2段構えになっているのではないかと推測しますが(そのほうが計算量が減るはずです)、良く分かりません」
で、このあたり、つまりGIMPの画像処理における、リニア、非リニア画像の扱いについて解説しているサイトを見つけました。GIMPの開発参与者である Elle Stone氏による英語による解説です。この点に関する日本語の解説サイトはどこにもないかと思います。このサイトの記述を読む限り、どうやら私の推測は合っているようです。
Elle Stone氏の解説を元にGIMPの動作機構を考えると次の図のようになります。
2.10(2.9)以降のGIMPでは、デフォルトの作業色空間は依然sRGBですが、sRGBよりも広い作業色空間やbit深度を選べるようになっており、また非リニアな画像だけではなく、リニアな画像も扱えるようになっています。
そして、Elle Stone氏の指摘によれば、ガンマ・エンコードされた非リニアな画像に関しては、Bablという画像変換エンジンでリニアに変えて、現在のGIMPの中心的画像処理エンジンであるGEGL内で画像処理を行っているということです*1。つまり、内部的にはリニアで画像処理を行っているわけです。で、ここからは推測ですが、GIMP内で画像データはGEGL内でリニアな形でのみ保持されており、おそらく、作業用色空間とは画像データが保管されている場ではなく、RGBデータをどう物理的な色の値(L*a*B*値)に対応させるかという変換テーブルのようなものであるというのが実態ではないかと思います。それはともかく、Bablで非リニアな画像をリニアに変えているとすれば、画像がリニアな場合、つまり作業用色空間がリニアな場合は、ガンマ・デコード処理は必要ないはずです。
しかし、Elle Stone氏の指摘によれば、作業空間がリニアな場合でも、現行のGIMPでは(但し、2018年秋現在*2 )、一部コマンドが依然、iccプロファイルを参照せず、無条件に画像がsRGB式にガンマ・ハードエンコードされているという前提で、Bablによってガンマ・デコードされてから実行されてしまう状況が残っているので*3、sRGBガンマ・エンコードされていない作業色空間を使うと、(必要のないガンマ・デコードが行われ) 誤った処理結果を生んでしまう可能性があるそうです。コマンドの改良は徐々に進んでいるそうですが、全面的に修正されるにはGIMP3.0のリリースまで待たなければならないだろうと言っています。従って、正確な処理結果を得たければsRGBを使うのが無難と言っています (これはsRGB色空間を使えという意味よりも、sRGB式ガンマ・エンコードを行ったRGBデータを使え、という意味かと思います)。またこの指摘が正しいとするとリニアな画像だけではなく、sRGB式ガンマ補正カーブを使わずにガンマ・エンコードされている作業用色空間を使っても(例えば純粋に2.2のガンマを使っていたり、1.8のガンマを使っている場合など)、一部の処理コマンドにおいて正しい結果が得られないということになります。
Elle Stone氏の様々な主張を総合して考えると、作業色空間をREC2020, ガンマをsRGB式知覚的ガンマ補正, そして精度を32bit浮動小数点で処理するのが望ましいということになります。Elle Stone氏はProPhotoよりREC2020の方が良いのではないかと述べています。但し、GIMPの現行バージョン(2.10.22)では、新規作成にするとガンマがかかっていないリニアな画像になります。それを考慮すると、sRGB式知覚的ガンマ補正にこだわらずに、作業色空間をREC2020, ガンマ補正なし(リニア), そして精度を32bit浮動小数点(但しメモリに余裕がない場合は16bit整数)でも良いのではないでしょうか。
で、以下、上のサイトの解説などを参考にGIMPの作業色空間の変更や、リニア / 非リニア画像処理について説明していきます。
1. GIMPで優先する色空間を変える
GIMP現行のデフォルトの色空間はsRGBです。ただ一応優先する色空間を変えることができます。メニュー→[編集]→[設定]→[カラーマネジメント]→[優先プロファイル]
ここでRGBプロファイルを変えます。
優先プロファイルは、WindowsのICCプロファイル置き場などから選択します。
Windows ICCプロファイルの置き場 (標準的構成の場合)
C:\Windows\System32\spool\drivers\color
ただ、ここで優先プロファイルを選択しても、xcf以外のファイルを読み込む際は常に、組み込みsRGBに変換しますか、と聞くダイアログが立ち上がります。つまりデフォルトは常にsRGBなので、あまり意味はないかもしれません。
2. ファイルを読み込む際に色空間を組み込みsRGBにしない
GIMPのデフォルトの色空間はsRGBですので、sRGB以外の画像を読み込む際、デフォルトの設定ではこのダイアログが立ち上がります。ここで、[維持]を選ぶとオリジナルのカラープロファイルが維持されます。[変換]を選ぶとsRGBに変換されます (ここでは、sRGB以外の変換はサポートされない。sRGB以外に変換したい場合は 3. の方法を使う)。レンダリングインテントは、通常[相対的な色域を維持]もしくは[知覚的]を選びます。
[相対的な色域を維持]もしくは[知覚的]のどちらを選ぶかは、出力デバイスや、画像の状態によりケースバイケースで、実際に試して決定します。ただ、[知覚的]の方は狭い色空間でも色の再現性を重視、[相対的な色域を維持]の方は、色の諧調保持を重視しているということです。具体的には[知覚的]は色空間に収まらない部分がある場合は、色空間全体を圧縮して収めようとし(→ 彩度が下がる可能性がある)、[相対的]は収まりきらない部分は近い色に置き換える (→ 彩度は下がらないが、オリジナルで区分できた部分が区分できなくなる可能性がある)、ということのようです。
参考サイト:
3. ファイルを読み込んだ後、色空間設定を変える
メニュー→[画像]→[カラーマネジメント]→[カラープロファイルに変換]
なお、[Assign Color Profile (カラープロファイルの割り当て)]を選ぶと、RGB値は変えずにカラースペースの割り当てだけ変えるので、彩度が急に上がる / 下がる などの副作用が出る可能性があります。逆に、データの色空間と、既存のカラープロファイルが一致しておらず、本来のカラープロファイルに変更を行うような場合は、[カラープロファイルの割り当て]を選んで下さい (つまりRGB値は変更せずカラープロファイルのみ変更する)。
次に図2のように、[Convert to ICC Color Profile (カラープロファイルの変換)]ダイアログが出ます。ここで、[変換]から変換したいカラースペースのプロファイルを選択します。レンダリングインテントは、どのようにRGB値を変換するかを指定するのですが、通常は[知覚的]もしくは[相対的な色域を維持]のどちらかを選びます。それ以外だと色が大きく変化する可能性があります。[知覚的]と[相対的な色域を維持]との違いの説明は上を見てください。
変換先カラースペースを増やすにはICCプロファイルが使えます。
4. 色空間の色深度 (bit数) および、リニア / 非リニアを変える
メニュー→[画像]→[精度]で変換
ここで色の深度(精度)のbit数と、画像のタイプのリニアか非リニア(知覚的ガンマ補正=sRGB補正カーブ を掛けた画像)の選択が可能です。なお、デフォルトではファイルを読み込んだ際はもともとの画像のbit数やリニアかどうかの設定が、新規作成の場合は、16bitリニアのsRGBが指定されます(Ver. 2.10.22の場合)。
bit深度を上げると、次に、[知覚的ガンマ(sRGB)]か[リニアライト]か、という選択のためのダイアログボックスが出ます。
[リニアライト]とはガンマ1.0の画像 (リニア画像)、[知覚的ガンマ(sRGB)] とは、sRGBで採用されているガンマ2.2に近似したガンマ補正カーブを掛けた画像 (非リニア画像) のことです。[知覚的ガンマ]は、sRGB以外の色空間でも選択することができます。なお、Elle Stone氏のサイトの解説によれば、GIMP2.10で採用されている内部画像エンジンGEGLは、基本的に32bit浮動小数点で動いており、元画像が何であれ、常に32bit浮動小数点を選択するのが、最も動作が早くなり好ましい (データ処理の際、データの bit 深度変換が不要になるため)、ということです。つまり、上で設定した色空間にかかわらず、GEGL 内部の作業色空間は、原則 リニア 32bit となるということです。ただ、この辺りマシンに積んでいる物理的なメモリ量が少ないとかえってパフォーマンスが落ちますので、ケースバイケースで決めてください。
最終結果を32bit浮動小数点で保存しない場合でも (32bit浮動小数点形式で保存すると、ソフトによっては読み取れない、またファイルサイズが大きくなる) 画像を出力(エクスポート)する際にbit数は選びなおせるので、そこで選択すればよいです。リニアか、非リニアかは、自分の目的によって選択すればよいです。ただしここでリニアを選択しなくても多くの処理は内部的にリニアで処理しているはずなので、非リニアでも色ずれは起こりにくいはずです (但し画像処理の際に「レガシーモード」を選ぶと非リニアで処理されるので、それを選ばないことが前提です)。但しこのままTIFFファイル等に出力するとリニアなまま出力されますので、処理中はリニアでも、出力結果は非リニアで保存したい場合は、保存前に非リニア(知覚的ガンマ)に戻す必要があります。
なお、すでに述べたように現行(但し2018年秋現在)のGIMPでは、[知覚的ガンマ(sRGB)] を選択したほうが確実に良い結果が得られるとElle Stone氏は述べています。ただそれから2年たった今は、新規作成のデフォルトがリニアなぐらいですから、知覚的ガンマを選ばずリニアでもさほど問題ない程度に改善されているかもしれません。もしElle Stone氏のアドバイスに従うなら、リニアな画像を出力する場合は、出力の直前に最後にリニアに直した方が良いかもしれません。この辺りは実際に試して決めてみてください。
また8bitリニアだと、諧調不足になる可能性があるので、リニアで処理したり、保存する場合は16bit整数以上で処理したり、保存する必要があります。
5. 現在の作業色空間の確認
メニュー→[画像]→[画像の情報]→[カラープロファイル]
6. リニアベースでトーンカーブ調整を行う
GIMPでは、作業色空間にかかわらず内部的にRGBデータをリニアに戻して画像処理を行っていますので、トーンカーブも現在の作業色空間にかかわらず、リニアRGBデータベースで調整を行うことができます。メニュー→[色]→[トーンカーブ]で、上図のように調整ダイアログを開いたら、右上の[リニアライトでカーブを調整します] アイコンをクリックすることで、リニアで調整可能です。その際ヒストグラムも、知覚的数値からリニア数値ベースに変化します。
7. リニアな画像ファイル出力
出力前に、必要に応じて出力したい色空間に変更し、さらに、メニュー→[画像]→[精度]で[リニアライト]を選びます(もちろん色深度は16bit以上で、出力したい色深度を選びます)。そして[ファイル]→[エクスポート]で、リニアな画像を許容するファイルフォーマット (例えばTIFF) を選んで出力します。8bitでリニアに出力すると、見た目に分かるほど画像が劣化します。Jpegは8bitしかサポートしません。
←ガンマ補正理解メモ(3) - Photoshopで色の明るさを変えると色自体(色相)も変わる!?に戻る
→ 次回 ガンマ理解補正メモ(5) - RawTherapeeにおけるガンマ補正の扱いは... ? に行く
*1:以下のページ参照。
*2:以下のページ参照。
*3:2016年7月現在ですが、GIMP2.9/10.xの、作業色空間を指定したiccプロファイルに関係なくsRGBガンマ補正カーブでエンコードされた画像を前提とするコマンド一覧が次のページにあります。
そのうち主要なコマンドのみ抜き書いて日本語訳を付します。
描画色背景色ダイアログ (FG/BG dialog)
カラーピッカー (ピクセルモードを除く)
レイヤーマスク: レイヤーマスクの描画
レイヤーマスク: グレースケール画像をマスクとして使用
レイヤーブレンドモード: 色相 Hue (LCH)
レイヤーブレンドモード: 彩度 Chroma (LCH)
レイヤーブレンドモード: 色 Color (LCH)
レイヤーブレンドモード: 明度 Lightness (LCH)
色/脱色/輝度およびLuma
色/色要素/チャンネル合成 (LABモード)
色/色要素/チャンネル分解 (LCHモード)
画像/モード (RGBとグレースケールの変換)
フィルター/ノイズ/CIE Lch ノイズ
但し、現在のバージョン (2.10.22) では新規作成にするとデフォルト設定がリニア(ガンマ=1.0)のsRGB色空間になるぐらいですので、その後、改善されている可能性は大です。
※なお輝度(Luminance)とLumaの違いは、両者ともグレイスケールに変換するときにGを約7割、Rを約2割, Bを約1割の割合で混ぜて明暗を決定するのは同じですが、LumaはそれがsRGBガンマ・エンコードされたデータを基に算出している点です。