Debayerしないカラーカメラの画像処理方法

以前の記事にて、私の画像処理フローについてまとめた記事を書きました。しかし、2019/12月頃より、画像処理フローを変更し、Debayerを使用しない方法(以下、CFA分解法)へ変更しています。今回の記事では、考え方と処理方法を記載します。


ちなみに、この方法は自分で思いついたものではあるのですが、すでに先駆者がいたようで、あぷらなーとさんが同じ方法を取られているようです。

処理方法の概要

天体写真の撮影には、カラーカメラまたはモノクロのCMOS/CCDカメラ(デジタル一眼レフカメラなどを含む)を使うことが多いと思います。カラーカメラのイメージセンサには、CFA (Color Filter Array)と呼ばれる、RGB三色に対応する透過スペクトルを持ったフィルタが取り付けられていています。(R, G1, G2, Bの4つのフィルタを並べた配列になっていることが多いです)
そのため、本来の意味での「撮って出し」の画像は、RGB三色の画素に対して輝度値の情報が書きこまれている、グレースケール画像 (以下, Pure RAWとする)となります。

カラーフィルター配列 Canonのホームページより引用


そこで、CFA画像をカラー化するために、R, G1, G2, Bのそれぞれの輝度情報から、色情報を補間する”Debayer”という処理を行います。このとき、RのピクセルにはGやBの輝度情報がないため、近傍にあるGやBのピクセルから輝度値を推算することを行います。このため、解像度が低下してしまいます。また、近傍にある別の色のピクセルの情報に影響を受けて、偽色が発生する可能性が高いと考えました。
一方、モノクロカメラでは、R, G, Bそれぞれのフィルタをセンサ前面に取付け、撮影することで、すべての画素で色情報を受けることができ、センサの持っている解像度を100%引き出すことができます。

Debayer のイメージ PixInsight Reference Documentation より引用

そこで、最近私が取っている方法である、CFA分解法は、画像をDebayerする前に各チャンネルに分解し、RGB3色のモノクロ画像として処理を進める方法です。これにより、(モノクロセンサを使った別撮りと同等にはなりませんが)色情報の解像度を疑似的に上げることができるのではと考えています。大まかには、次のような手順で行います。

① CFA画像をR, G1, G2, Bの各チャンネルに分解
② 分解した画像をそれぞれ別個にスタックする
③ DrizzleIntegrationを行い、解像度を上げる
④ 生成したRGB画像を重ね合わせ、カラー画像とする

③の工程がポイントで、情報がないピクセルの輝度情報を同じ色の画素から補間するため(例えばRチャンネルなら、近傍の画素は全てRであり、GやBの画素の輝度情報に影響されない)、補間には変わりありませんが、Debayerに比べて偽色が出にくく、色情報の解像度が上がるのではないか?と考えました。

2021/3/20追記: 本方法とDebayerの違いは、補間方法の違いだけと考えられます(色情報の解像度には影響しない)。追加調査実施次第アップデートします。

処理フロー

CFA分解法を取り入れた、私の処理フローを示します。工程の名前は全てPixInsightのProcess名となっています。
基本的な工程は前回までの記事で解説した方法と同様になりますが、変化するポイントに絞って補足します。

PixInsightの処理フロー

3. SubFrameSelector

SubFrameSelector / Blink を使った画像の選別ですが、CFA画像に分解してから行うと煩雑なため、SplitCFAの手前で選別を行います。手順は以前の記事と同様です。

4. SplitCFA

SplitCFAはPure RAWをR, G1, G2, BそれぞれのCFA画像に分解するプロセスです。3. が完了したファイルを追加し、”Apply Global” (●)で処理すれば終了です。

処理が完了すると、元画像が保存されているフォルダ内に、”CFA0″, “CFA1″,”CFA2″,”CFA3″のフォルダが生成され、ファイル名の末尾に”_CFAn” (n=0-3)が追加されたファイルが生成されます。CFAの末尾の数字は、Bayer配列の順序に対応しており、例えばRGGBであれば、R: 0, G1: 1, G2: 2, B: 3となります。
G1, G2は全部をまとめて1つのG画像としてスタックするため、一つのフォルダへファイルをまとめておきます。

SplitCFAの設定

ImageIntegrationまで

4. で生成したそれぞれのグレースケール画像を、チャンネル別にスタックします。詳細な手順はこちらの記事を参照ください。SubFrameSelectorまでは全チャンネルの画像をいっぺんに処理しますが、位置合わせは各チャンネルごとに行うようにしています。

9. DrizzleIntegration

SplitCFAを実行した画像は画素数が元のファイルの1/4となっています(縦横のサイズが1/2)。そのため、4× Drizzleを行い、元画像の2倍の解像度へ補間を行います。完了すると、R, G, Bそれぞれに対応したモノクロ画像が3枚生成されます。スタックが終わったファイルは、デフォルトで”drizzle_integration” (R画像), “drizzle_integration1” (G画像), “drizzle_integration2” (B画像)と命名されますので、こちらを活用します。

DrizzleIntegrationの設定

10. StarAlignment

9. が終わったら、RGB各画像の位置合わせを行います。基準画像をGチャンネルとして、R, Bチャンネルの画像について位置合わせします。

11. LinearFit

10. が終わった状態でRGBの画像を重ね合わせると、Gが強くなってしまいます。カメラのBayer配列ではGの画素数がR, Bの画素の2倍あり、Gチャンネルのみ実質的な露光時間が2倍になっていることが関係していると考えます。
そこで、各画像の輝度値を揃えます。
“PROCESS”→”LinearFit”を起動し、Reference imageにRチャンネルの画像を指定します。◣マークをG, B各チャンネルの画像にドロップし、処理を実行します。

LinearFitの設定

12. ChannelCombination

11. までの操作が完了したファイルをRGB合成し、カラー画像とします。下図の通り処理を実行します。

ChannelCombinationの設定

Debayerとの比較

実際に処理を行い、従来法(Debayer)との比較を行いました。処理に使用したサブフレームの枚数は枚で統一し、Debayer/SplitCFA以外の手順は同様としました。処理が終わった画像を色合わせし、STFにてオートストレッチして比較を行います。

例1 M81 CFA分解法
例1 M81 従来法

拡大画像を見ると、CFA分解法の方が細部の解像感が良いような気がします。どうしても個人の主観が入ってしまいますので、みなさんのご意見をいただきたいところです。

ピクセル等倍 CFA分解法
ピクセル等倍 従来法

続いて、より定量的な評価として、画像のSN比を算出しました。おなじみ、Herbert Walterさんのサイトよりダウンロードしたスクリプトを実行してみます。
結果は、CFA分解法の方がSNRが高く、ノイズが少ないことを示唆する結果となりました。バックグラウンドのノイズについても、処理方法による違いがある可能性があります。

SNR CFA分解法
SNR 従来法

次に2例目として、別の画像を処理しました。しかし、1例目と異なり、SNRはほとんど変わらないか、若干下がる結果となりました。ただし、細部の解像感は、先の例と同様に、CFA分解法に分があるように感じています。

例2 M51 CFA分解法
例2 M51 従来法
ピクセル等倍 CFA分解法
ピクセル等倍 従来法
SNR CFA分解法
SNR 従来法

今回はDebayerを使わない画像処理の方法について検証しました。処理が面倒ですが、若干なりとも結果が良いように感じているので、現在はこの方法を愛用しています。
この方法による問題点や課題が見えていない状況なので、ご意見・ご指摘等をいただけると幸いです。

“Debayerしないカラーカメラの画像処理方法” への5件の返信

  1. You should simply enable CFA drizzle checkbox while drizzle integration

    1. Dear Tarun,
      Thank you for your comment.
      I didn’t even know how “CFA drizzle” works, let me try it.

  2. 一般的な用途のデジタルカメラではリニア補間は偽色が出るため利用されませんが、非常に高速なデモザイク手法なのでプレビューなどで用いられることがありますよね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です