rawpyの現像関数、postprocess関数の引数のhalf sizeおよびfour color rgbに関して確認します。
postprocessに関しての詳細はこちら。
別にこの2つのパラメータ、関連性があるわけではないです。どちらも説明から十分その機能が推測できる、単純なパラメータなのでいっぺんに確認します。
half size
ドキュメントによると、画像を縦横半分のサイズで出力します。2×2ブロックを補間せずに1画素にします。とあります。
half size = Trueの状態で、試しにデモザイクアルゴリズムを色々振ってみましたが、出力画像に変化が出ませんでした。デモザイクをパスするようです。わかりやすいオプションです。デモザイク処理のオプションになる、 dcb_enhance や dcb_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チャネルを独立に扱いたい人向け(かなり特殊用途)
かなと思います。それほど分かりにくいオプションではなく、思った通りの動きをしてくれました。
コメント