rawpyの現像関数、postprocess関数の引数のdemosaic algorithmに関して確認します。
postprocessに関しての詳細はこちら。
デモザイキングのアルゴリズムを指定するこのオプションですが、いろいろ封じられています。 正直一つ一つのアルゴリズムを確認するのはつらいので、動かして適当にお気に入りを探そうと思いましたが、使えないものもありました。そのあたりを確認した結果を記載したいと思います。
デモザイキング
これは言わずもがなですかね。ココで詳細説明しませんが、同一座標において必ずしもRGBがそろっていない、いわゆるベイヤ配列の画素データを補間演算を用いて、同一座標におけるRGBをそろえてあげる処理です。デベイヤとも呼ばれるようです。
単純な線形補間によるGreenの補間をイメージしたものが上記。左がいわゆるベイヤ配列によるRGBデータ。右がGreenだけを抽出したもの。1画素置きに歯抜けになっています。このようにして周りの画素から欠落画素を作ってあげる処理となります。
このサイトでわかりやすく、詳しく説明されているので、詳細はこちらにお任せします。rawpy(postprocess)で指定できるアルゴリズムに関しても特徴が簡単に述べられています。
大真面目にデモザイクのアルゴリズムを理解しようとすると、英語の論文をがっつり読み込むテンションが必要です。それはそれで面白そうですが、そこまでの気力もないのでここでは使ってみるだけにします。
使用可能なアルゴリズム
上記のサイトを読むと AMaZE がいい感じのアルゴリズムだぜ。みたいな記載があるので、それを試そうと思いましたが、rawpyのpostprocess経由だと使用することができませんでした。他にも何種類か使えないアルゴリズムがあるようです。試したところ、
AFD
LMMSE
MODIFIED_AHD
VCD
VCD_MODIFIED_AHD
AMAZE
と、これらのアルゴリズムの使用の際に怒られました。メッセージとしては、AMaZE以外のアルゴリズムは
requires GPL2 demosaic pack
AMaZEでは
requires GPL3 demosaic pack
と怒られました。これらの別パッケージが必要なようです。いわゆるGPLのライセンスに沿ったコードのようで、AMaZEに至っては特許も絡んでそうです。GPLの詳細もここでは割愛しますが、簡単に言うと、「このコードを使って書いたコードもちゃんと公開してね。だったら使っていいよ。」といった感じですかね。
ではこのパッケージを入れてやろうかと思って、rawpyのベースとなるlibRawの本家のサイトから現時点での最新LibRaw-0.19.5をダウンロードし、展開し、READMEを読んでみたところ…
LibRawデモザイクパックのサポートを停止せざるを得ませんでした。提供されたコードは数年間古く、初期の貢献者は興味がありません。
私たちLibRawチームは、RAWデコードとメタデータ抽出に焦点を合わせましたが、postprocess(デモザイク、ノイズ抑制など)には焦点を合わせていませんでした。
でもサポートはするよ。
README.demosaic-packs
文面はGoogle翻訳です。入手できなそうです。さらに言うとpostprocess関数のメンテは止まってそうです。何せ興味がないそうなので…。
逆に、
AHD
AAHD
DCB
DHT
PPG
VNG
LINER
は使えました。なのでいったんこれらのアルゴリズムの性能を見てみようと思います。
コード
引数指定します。使える引数は
demosaic_algorithm=rawpy.DemosaicAlgorithm.AHD,
demosaic_algorithm=rawpy.DemosaicAlgorithm.AAHD,
demosaic_algorithm=rawpy.DemosaicAlgorithm.DCB,
demosaic_algorithm=rawpy.DemosaicAlgorithm.DHT,
demosaic_algorithm=rawpy.DemosaicAlgorithm.PPG,
demosaic_algorithm=rawpy.DemosaicAlgorithm.VNG,
demosaic_algorithm=rawpy.DemosaicAlgorithm.LINER,
の7つです。
import rawpy raw = rawpy.imread(filename) img = raw.postprocess(half_size=False, demosaic_algorithm=rawpy.DemosaicAlgorithm.AHD, output_color=rawpy.ColorSpace.raw, )
とhalf_sizeをFalseにしてあげる必要があります。(デフォルトFalseですがね。)Trueだとデモザイク処理がバイパスされそうです。ColorSpaceは別にrawである必要はありませんが、変な処理してほしくなかったのでとりあえず指定しただけです。
最後画質の比較を行っていきます。
比較
LINERは文面からも線形補間だと思われるので、処理が想像できます。性能(画質)はイマイチな気がします。速度は速いかもしれませんが。
AHDも上記サイトではイマイチな解説です。だたrawpyデフォルトはこのAHDのようです。DCBはいい感じで紹介されています。VNGはかなりマニアックな状況で効力を発揮しそうに書かれています。AAHD、DHT、PPGに関しては解説無しです。
というわけでここではこのDCB、AHD、AAHD、DHT、PPGに関してLINERと画像を並べてお茶を濁そうかと思います。(VNGはスペースの都合上割愛)アルゴリズム不明で並べてもあまり意味ないのですが、印象だけでも。
本来は画像やカメラの種類を変えてみたり、パターン画像のようなものを使うのが筋なのだと思いましたが、手元にそんなものはないのと、現実的な被写体でもないので、ここではそこいらの適当な画像をソースにします。今後機会があればそんな被写体の画像も載せようと思います。
今回はiPhoneSEで暗部をRAW撮影した被写体を使いました。ノイズの感じで違いがわかりやすかったので。
かなり拡大しないと違いが判りません。モアレが出そうな高周期な画像でないと比較の面白みがない気がします。それでも強いエッジ部には違いが見えています。LINERでは画像がぼけ、かつピンクがかった偽色が出ています。に対して、DHT、PPG、AHD、AAHDでは偽色は見えません。ノイズも含めて強いエッジ強調がされているように見えます。DCBはその中間。VNGも画像は載せてませんが、印象はやはり中間。
少し平坦部を見てみます。
DHT、PPG、AHD、AAHDでは、S/Nが悪く見えてしまいます。暗いところを撮影した被写体や、ISOが高い画像では、ノイズ除去と併用する必要がありそうです。この画像からは、色ノイズは押さえられているように見えますが、DHTが特にノイジーに見えてしまいます。
まとめ
正直どのアルゴリズムがどんな画像に最適か、この検討からだとわかりません。もう少し得意不得意な被写体を探した方がいいかもしれません。いずれのアルゴリズムも、線形補間に対しては画質的なアドバンテージがありそうなので、うまく使いこなせるといいかなと思います。
また、DCBに関してはもう少しオプションがあるようなので、これだけは少し突っ込んで確認してみようと思います。
コメント