rawpyの現像関数、postprocessの引数であるhighlight_modeに関して、値の意味を確認していきます。
postprocessに関しての詳細はこちら。
いろいろ実験はしてみたのですが、正直今回のパラメータは最後まで意味がよくわかりませんでした。いろいろ試した結果だけ載せておきます。
highlight mode
ハイライトモード。HighlightModeは、Clip, Ignore, Blend, Reconstruct, ReconstructDefault の5種類存在する。
この指定にはenumがあるようで、
rawpy.HighlightMode.Clip
rawpy.HighlightMode.Ignore
rawpy.HighlightMode.Blend
rawpy.HighlightMode.ReconstructDefault
rawpy.HighlightMode.Reconstruct = bound method HighlightMode.Reconstruct of enum 'HighlightMode'
それぞれが何を意味するのか詳細の説明が見当たりませんでした。
ハイライトをどうにかするとしかわかりません。全く持って詳細分かりません。本家librawのドキュメントを参照してみます。
int highlight;
0-9: Highlight mode (0=clip, 1=unclip, 2=blend, 3+=rebuild).
やはり謎です。文言からすると、ハイライト(最大値)をなにがしかするというモードでしょうか?clipということは最大値にクリッピングする。って意味だろうか?ignore(unclip)だとそれを無視する?ということは値が回り込む?blendとは何をブレンドするんだろう。
やはり謎です。3以降はさらに謎です。実験してみるしかありません。
実験
各モードで現像してみます。シンプルな設定で、自動明るさ補正を掛けたものです。clip, ignore, blendの3種類の現像をした結果のヒストグラムを表示させます。
左から、highlight mode = clip, ignore, blendに設定したヒストグラムです。
ignoreには大きな違いがあります。ignoreにすることで暗い方向にシフトしました。ignoreに関しては自動明るさ補正が全く効いていないようです。閾値設定の1%の画素飽和が起こっていないように見えます。ただ傾向は不明。
clipとblend(左端と右端)も完全一致はしていませんが、傾向が似ていることが分かります。
続いて、自動明るさ補正をOFF(no_auto_bright = True)にした結果が以下
並びは先ほどと同じように、左から、clip, ignore, blendに設定したヒストグラムです。
今回の写真ではREDが一部最大値に飽和していて、highlight mode がclipにおいて、自動明るさ補正のOFF / ONでヒストグラムの形状はそれほど変化しませんでした。また、ignoreはそれこそ自動明るさ補正がONと時とまるで同じに見えます。
今度はblendの傾向が少し違います。自動明るさ補正がONの時はclipと似た傾向を示していましたが、今回はどちらかというとignoreと近い傾向を示しています。
これも近いというだけで、同じではありません。重ねてみると、
このようにハイライト部でblendの方は値が折り返っているように見えます。greenも最大値を取る画素がなくなっているように見えます。
ignoreに関しても、自動明るさ補正が無視されるだけで、通常の明るさ補正は効いています。謎です。
露出補正(exposure shift)を1段下げた(0.5)したうえで、clip設定したヒストグラムと、ignoreのヒストグラムを比べてみます。
左がclipの設定のまま露出補正を1段暗くしたもの、右が露出設定はそのままで、highlight mode = ignoreに設定したもの。
ガンマ2.2が効いているので、線形性は見られませんが、どうもclipされる最大値までの傾向は似ています。ignoreすると明るさが半分になっている。ということでしょうか。
併せて、0:clip, 1:ignore, 2:blend の先の3,4,5,6,7,8まで試しましたが、3~8に関しては無変化でした。微妙にignoreとは違いましたが似た感じでした。
まとめ
正直よくわかりません。ignoreにすると、デフォルトのclipに対して明るさが半分くらいになります。誰か教えてください。
注意点としては、非デフォルトのignoreにすると自動明るさ補正(auto bright)が全然効果なしです。
またblendに設定すると自動明るさ補正OFFでハイライトの折り返しのような現象が出ます。極ハイライトに色被りのような影響が出ています。
今後はこのパラメータいじらないと思います…。
コメント
はじめまして。記事、拝読いたしました。
rawpyもlibrawもハイライトの復元(或いは回復、再構築)に関する記載が全然なくてアレですが、おそらくはdcrawのオプションを模倣しているものだと思われます。
「clip」は白飛びした部分が真っ白(8bit RGB値で見るなら、R255 G255 B255)になります。dcrawでは「-H 0」に相当します。
「ignore」については自信がありませんが、dcrawのクリップしないで残すオプション「-H 1」に相当するのでは無いかと思います。
「blend」は、ベイヤー機であればRGBのカラーフィルターを通った光(要するに他のチャンネル)から、ハイライトが飛んでいない部分を探して、近い値を入れる機能だと思われます。dcrawでは「-H 2」に相当します。
多くのオープンソースRAW現像ソフトは完全にクリップするか「ブレンド」を使って無難な回復を試みていますが、Adobe Camera Rawなどは独自の方法でハイライトを復元しているようで、他のソフトに比べて多くのシーンではとても上手に働きます。
それ以降(3〜9)を入力するものはかなり強力なハイライト復元を試みるもので、存在しない色を近い色から推測して入れてくれるような機能だと思われます(説明が下手くそでごめんなさい)。dcrawでは「-H 3〜9」に相当します。
rawpyでデフォルト値とされている「5」は、dcrawで最初に試す数値(「Try -H 5 as a compromise.」なんて書かれることがあります)として設定されているものと同じですね。
なおSigmaのX3Fでもうまく動作しましたが、X3FからDNG(Stack)に変換したものを試したところ、ハイライト復元の機能がうまく効いていない(output_colorをRAWに設定した場合のみ?)っぽく、調査中です……。