rawpyでPython現像その23(half size / four color rgb)

python

 rawpyの現像関数、postprocess関数の引数のhalf sizeおよびfour color rgbに関して確認します。

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

 別にこの2つのパラメータ、関連性があるわけではないです。どちらも説明から十分その機能が推測できる、単純なパラメータなのでいっぺんに確認します。

half size

 ドキュメントによると、画像を縦横半分のサイズで出力します。2×2ブロックを補間せずに1画素にします。とあります。

 half size = Trueの状態で、試しにデモザイクアルゴリズムを色々振ってみましたが、出力画像に変化が出ませんでした。デモザイクをパスするようです。わかりやすいオプションです。デモザイク処理のオプションになる、 dcb_enhancedcb_iterations も効きません。

 同様にTrueでは、以前確認したように、デモザイク前ノイズ除去の fbdd_noise_reduction も効きません。(ウェーブレットノイズ除去、メディアンフィルタは効きました。)

 逆に意外なところでは、レンズ収差補正オプション chromatic_aberration はhalf size = Trueでも動きました。

 デモザイク不要。というシチュエーションにピンときませんが、トーン調整の効果確認用のプレビューや、自前でデモザイク書くときなんかに使えるんでしょうか。そんなオプションです。(現像処理は早いです)

 今回に限らず、色々現像パラメータを変えながら結果を見るときには重宝しました。デモザイク処理は遅いし、画素数が4倍に増えるのでその後の処理時間にも影響すると思います。

 ちなみにGreenチャネルはセンサの2画素平均で作られてそうです。(four color rgbと合わせて最後に検証)

four color rgb

 説明書きとしては、”2つのグリーンチャネルを独立に補間するか否かのフラグ。”とあります。

 これですが、2つのグリーンチャネルを独立に補間するとなると、4chで出力されるのか?と思いましたが、どうもそう単純でもなさそうです。3chのRGB画像として出てきます。

 ただこのfour_color_rgb=TrueとFalseで、RとBのチャネル出力は同じになりました。Greenチャネルの現像方式にのみ違いが出ることはわかりました。この時は、色変換もOFF(output_color = rawpy.ColorSpace.raw)で、加えてデモザイクアルゴリズムもRGBの相関を見ないであろうもの( demosaic_algorithm = rawpy.DemosaicAlgorithm.LINEAR )にしました。

 色々試していたら、4ch出力される条件がありました。かなりマニアックな設定ですが、以下の3つの条件の時に4ch画像として出力されました。

・half size = True (デモザイクOFF→RGBが混ざらない)
・output_color = rawpy.ColorSpace.raw (3×3行列によるRGB演算しない→RGBが混ざらない)
・four_color_rgb = True (2つのGreen独立→Green 2chが混ざらない)

 要はRGBGの信号を混ぜる事がない設定時には、2つのGreenチャネルを独立で出力してくれるようです。

import cv2
import rawpy

raw = rawpy.imread(filename)
img = raw.postprocess(half_size = True,
                      four_color_rgb = True,
                      output_color = rawpy.ColorSpace.raw)

print(img.shape)
cv2.imwrite("out.tif",img[:,:,[2,1,0,3]])

 このスクリプトを動かすと、(1512, 2016, 4)とかがprintされ、4chであることが分かります。そして保存される画像は、RGBαの画像になっており、αチャネルにはGreenデータが入っていました。

 逆にこのオプションでない限り、2つのGreenチャネルのデータは、どこかで混ざってしまうので、あまり使い出がないような気がします。完全に自前デモザイクする強者用のオプションですね。

half size出力時のGreen補間方法推測

 four color rgbオプションで 4ch 生の値らしきものが取れることが分かったので、half size = Trueで得られるデモザイクスルーのGreenチャネルはどうやって作られているか?を簡単に確認してみました。予想通り平均だと思われます

 以下の検証コードは、half size = True / four color rgb = Trueで出した2ch Greenを平均してgreen信号作って、それとhalf sizeでデモザイクをキャンセルしたもののdiffを取ったものです。この結果diffは高々1だったので、平均でしょう。おそらく。(平均値を計算した時の下位1bitが欠けてるだけだと思われます。)

 もろもろ色補正、ガンマの類をOFFにしています。

import cv2
import rawpy

raw = rawpy.imread(filename)
gam = [1.00,0.00]    # thru gamma

# four color rgb
img = raw.postprocess(half_size=True,
              four_color_rgb = True,
              output_color = rawpy.ColorSpace.raw,
              no_auto_bright=True,
              use_camera_wb=True,
              gamma=gam
              )

# create green chanel from ch1 and ch3 (average)
green = (img[:,:,1].astype(np.int16) + img[:,:,3].astype(np.int16) + 1) // 2

# three color rgb (normal)
img2 = raw.postprocess(half_size=True,
              output_color = rawpy.ColorSpace.raw,
              no_auto_bright=True,
              use_camera_wb=True,
              gamma=gam
              )

# difference
dif = abs(green - img2[:,:,1])
print(dif.max())

 このコードの結果、1がprintされました。

まとめ

 half size : デモザイク処理キャンセルオプション。高速デコード可能。Greenチャネルは平均で生成。

 four color rgb : 2つのGreenチャネルを独立に扱いたい人向け(かなり特殊用途)

 かなと思います。それほど分かりにくいオプションではなく、思った通りの動きをしてくれました。

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

コメント

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