rawpyでPython現像その13(no auto scale)

python

 postprocess関数の引数のno_auto_scaleに関して、値を動かしながらその効果を確認していきます。

 postprocessに関しての詳細はこちら

 この値もどうやらゲイン調整の一種のようです。スケールは画像のサイズ(大きさ)のスケールではなく、画素値のスケールです。現像対象のrawデータのビット数に依存します。カメラのRAWデータのビット数を確認しておく必要があります。

no_auto_scale

 ドキュメントによると

 画素値のスケーリングをするか否かのフラグ。デフォルトはFalseでスケーリングするの意味

 とのこと。このスケーリング処理はデフォルトでON ( no_auto_scale = False )なのでこの処理をキャンセルするには、no_auto_scale = Trueを設定する必要があります。ややこしいです。

 普通Trueにする機会はなさそうです。というのも、この値、カメラRAWのビットのままデータを出力するモードのようです。ここでいうスケーリングとは、内部の演算ビット(おそらく16bit)に画素を正規化するか否かのフラグのようです。デモザイクだけさせたい時などには使えるかもしれません。

 このスケーリングはおそらくデモザイク処理の前に行われ、スケーリングをオフ( no_auto_scale = True )にすると、デモザイク前に行われるであろうことが予想される、ホワイトバランス調整や露出調整(exp shift)の値を無視します。値をいじっても何も変化しませんでした。これらの調整値も合わせてスケーリングと呼ぶのかもしれません。black levelの補正は動きました。

 ただし、デモザイク後の処理だと思われる、自動明るさ補正( auto bright )や明るさ補正( bright )、ガンマ補正は機能しました。とはいえスケーリングをオフにした状態でこれらの調整に意味があるかは甚だ疑問です。

 かなり特殊ケースで使うオプションですね。最後実験で確認してみます。

実験

 スケーリングOFFとONの2つをグラフにしてみます。カメラRAWのビット数が異なるCanon EOS 5D MkII と Olympus OM-D EM10 MkIIの2つRawデータで確認してみます。ちなみにビット数はそれぞれ

EOS 5D MkII :14bit
OM-D EM10 MkII:12bit

 となっています。検証用コードです。

import rawpy
from matplotlib import pyplot as plt
import cv2

raw = rawpy.imread(filename)
gam = [1.00,0.00]
img1 = raw.postprocess(half_size=True,
                       demosaic_algorithm=rawpy.DemosaicAlgorithm.LINEAR,
                       no_auto_bright=True,
                       output_color=rawpy.ColorSpace.raw,
                       gamma=gam)

img2 = raw.postprocess(half_size=True,
                       demosaic_algorithm=rawpy.DemosaicAlgorithm.LINEAR,
                       no_auto_bright=True,
                       output_color=rawpy.ColorSpace.raw,
                       no_auto_scale=True,
                       gamma=gam)

plt.scatter(img1[:, :, 0], img2[:, :, 0], label='R')
plt.scatter(img1[:, :, 1], img2[:, :, 1], label='G')
plt.scatter(img1[:, :, 2], img2[:, :, 2], label='B')
plt.xlim(0, 255)
plt.ylim(0, 255)
plt.legend()
plt.show()

 この結果プロットされるグラフが以下です。横軸が入力(auto scale)、縦軸が出力(no auto scale)になります。

 まずはEOS(14 bit)

EOS 5D MkII no_auto_scale = True

 出力が60付近で値が終わっています。つまり、最大値が64ないくらい。255の1/4程度です。すなわち、16bitの演算精度に対して、14bitで出力をしている気がします。最後出力を8bitに指定しているので、その分のまるめが入っているので、値はひどい感じに見えます。 14bitの最大値が16383、16bitの最大値が65535。なので、255に正規化すると、

16383 / 65535 = 63/ 255

 続いてOM-D(12bit)

OM-D EM10 MkII no_auto_scale = True

 値が小さすぎてわかりません。縦軸を1/4してみます。

 ギザギザですが、グラフの傾きの見た目がEOSのそれに近づきました。最大値はおそらく16付近。16bitの演算精度に対して、12bitで出力をしている気がします。12bitの最大値が4095、16bitの最大値が65535。なので、255に正規化すると、

4095 / 65535 = 16 / 255

 実験からもそれっぽい結果が得られました。8bit出力だとよくわかりませんね。16bit出力にするとちゃんとそれっぽい結果が得られました。

まとめ

 このscaleの処理は、データRAWが持つ画素値のビット精度のままの出力を行う時用のオプション。ホワイトバランス調整や露出補正を無視するが、ブラックレベルは調整してくれる。

 その他の明るさ補正系も含めてOFFにし、出力を16bitに指定したときにはじめて役に立ちそうな、そんなニッチなパラメータのようです。

python現像
スポンサーリンク
キャンプ工学

コメント

タイトルとURLをコピーしました