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チャネルを独立で出力してくれるようです。
1 2 3 4 5 6 7 8 9 10 | 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にしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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チャネルを独立に扱いたい人向け(かなり特殊用途)
かなと思います。それほど分かりにくいオプションではなく、思った通りの動きをしてくれました。
コメント