天体写真

晴れない夜は基本の復習③

★前回では・・・
天体画像に見立ててExcelに手書きした絵をベイヤー画像に変換するところまでできました。
f0346040_00315872.jpg
★ベイヤーデータを各画素に割り振ります
ベイヤー配列に記録された輝度データをRGB各画素の配列に割り振ってみます。
これはもう、コーディングの必要がありませんね。そのまま各画素のセルから参照させるだけです(笑)
(こういう手抜きをするためにExcelを選んだわけでして・・・・。)
f0346040_00443947.jpg
ちなみに、各画素の様子を見るために、次のようなコードで視覚化してみます。
-------------------------------------
'///////////////R画素データのイメージ化処理/////////////
X0 = 4
Y0 = 94
Yshift = 94 - 49 'ベイヤーR画素データセルとのシフト量
For I = 1 To 40
X = X0 + I
For J = 1 To 40
Y = Y0 + J
R = Cells(Y - Yshift, X).Value
Cells(Y, X).Select
With Selection.Interior
.Color = RGB(R, 0, 0)
.Pattern = xlSolid
End With
Next
Next

'///////////////G画素データのイメージ化処理/////////////
X0 = 47
Y0 = 94
Yshift = 94 - 49 'ベイヤーG画素データセルとのシフト量
For I = 1 To 40
X = X0 + I
For J = 1 To 40
Y = Y0 + J
G = Cells(Y - Yshift, X).Value
Cells(Y, X).Select
With Selection.Interior
.Color = RGB(0, G, 0)
.Pattern = xlSolid
End With
Next
Next

'///////////////B画素データのイメージ化処理/////////////
X0 = 90
Y0 = 94
Yshift = 94 - 49 'ベイヤーB画素データセルとのシフト量
For I = 1 To 40
X = X0 + I
For J = 1 To 40
Y = Y0 + J
B = Cells(Y - Yshift, X).Value
Cells(Y, X).Select
With Selection.Interior
.Color = RGB(0, 0, B)
.Pattern = xlSolid
End With
Next
Next
--------------------------------------
ああ、何の工夫も無いベタなコード・・・・。ま、動けば良いんです。リハビリですから。
f0346040_00481969.jpg
はい。各画素を通すとどのような画像が見えているのかが演算できました。

★デモザイクの準備
RAWデータを現像するときには上記のようなデータを元にカラー画像に変換しているわけですが、このままではマズいですね。RGBどの画素も「スカスカ」なので、その隙間を補完してやる必要があります。補完処理はコードを書かずにEXCELそのままで行くと楽ちんです。
f0346040_00593418.jpg
RGB全ての画素に共通した処理として、周りを4つの有効画素に囲まれている位置(★マーク)には、周りの4つの平均値を代入してみました。(たぶんコレは正解)
Gデータはこれで全ての隙間が埋まることになります。ただしRとBは画素数がGの半分しか無いので、周りに2つの有効セルしか無い部分(○と△)には上下もしくは左右に隣接する2つのセルの平均値を代入してみました(これが実際の処理かどうかは自信がありません)。

さらに補完したデータを視覚化するコード(参照先が変わるだけで補完前の表示コードと同じ物)を通せば・・・
f0346040_01050975.jpg
各色とも滑らかな画像に変わりました。
ちなみに40×40のマトリクスのうち外周部分がグレーになっているのは、隣接するセルが足りず補完が不可能なエリアだからです。
そういえば、ASI1600MC-COOLと同じ撮像チップを搭載しているオリンパスの某デジタル一眼レフでは、総画素数1685万画素で有効画素数1628万画素と公称されていますが、この減少分が外周部分だと言うわけでしょうね。

★いよいよRGBデータを合成します
ここまでできると、あとは簡単ですね。補完演算した各セルの値をRGBの輝度と見なして表示させるコードを書きます。
---------------------------------
'///////////////デモザイク処理イメージ表示処理/////////////
X0 = 90
Y0 = 229
RYshift = 229 - 139 'ベイヤーR画素補完演算セルとの行シフト量
RXshift = 90 - 4 'ベイヤーR画素補完演算セルとの列シフト量
GYshift = 229 - 139 'ベイヤーG画素補完演算セルとの行シフト量
GXshift = 90 - 47 'ベイヤーG画素補完演算セルとの列シフト量
BYshift = 229 - 139 'ベイヤーB画素補完演算セルとの行シフト量
BXshift = 90 - 90 'ベイヤーB画素補完演算セルとの列シフト量
For I = 2 To 39 '左端と右端は処理から外す
X = X0 + I
For J = 2 To 39 '上端と下端は処理から外す
Y = Y0 + J
R = Cells(Y - RYshift, X - RXshift).Value
G = Cells(Y - GYshift, X - GXshift).Value
B = Cells(Y - BYshift, X - BXshift).Value
Cells(Y, X).Select
With Selection.Interior
.Color = RGB(R, G, B)
.Pattern = xlSolid
End With
Next
Next
------------------------------
・・・と、こんな感じでしょうか。
f0346040_01163334.jpg
ベイヤーデータのデモザイク処理が完成しました♪

★結論
いや、実際どうでも良いことなんですが、結局
f0346040_00094342.jpg
こんな元画像をASI1600MC-COOLのようなGRBG型ベイヤー素子で撮影すると、上記のようなRGB画像が得られることがシミュレートできました。
・・・やっぱり2×2ピクセルくらいの星像を入射させても、デモザイクの原理から言ってローパスフィルターなしでは偽色が発生するのは仕方ありませんね。
また、相当に解像度が低下していますが、これもベイヤー素子の宿命でしょう。

★というわけで
「なんちゃってベイヤー現像シミュレータ」
EXCELだけで完成しました。根幹ができるとあとは楽なので、ここにノイズ付加機能やらビニング機能やらを書き加えていけば色々とロジックの検証ができます。

・・・・・ああ、こんな簡単な処理に大汗かいてしまった。
・・・正直、13年前に戻りたいです(涙)。


Commented by けむけむ at 2016-09-08 04:55 x
ははぁ、こんな具合になってるんですかぁ
派手派手盛り盛りだとさらに強調やら削ったりやらやりたい放題なので原型を止めないのも当たり前ですねぇ (^o^;

ループのカウンタってみんなIやJですよね... FORTRANの名残ですかねぇ...

Delphi ものすごく高くて starterが廉価版らしいですが、かなり制限があるらしいです。
Commented by supernova1987a at 2016-09-08 07:18
> けむけむさん
はっ。無意識にiとかjとか使ってますが、そういえば学生時代は「i、j、k、l、m、nから始まる変数は暗黙のインテジャー型」なんていう指導を受けたように記憶しているので、私個人に関してはその影響です。FORTRAN77病ですね。Delphi、値段見てビックリ。昔よりお高いですねぇ。まさか1600万画素の演算をExcelにさせる訳にはいかないので、手持ちのコンパイラを復活させるかフリーのコンパイラを物色しないとダメですね。
Commented by 天文ファン at 2019-06-09 23:08 x
この補完方法は、二アレストネイバー法あるいは、バイリニアー法と呼ばれる手法で、大昔より「偽色が多いので使い物にならない」と評価されている手法です。しかし、低解像度の写真なら使える場合があると思います。現在は、VNG(バリアブルナンバー・オブ・グラディアント)法やAHD(アダプティブ・ホモジナイアティ・ディレクテッド)法が無料の現像ソフトの主流です。VNGは、10×10のカーネルを使ってラブラシアンを使ってウェイトを決める方法、AHDは写像関数を使って最適値を更に絞る方法で、偽色がほとんど全く発生しません。しかし、メーカーのアルゴリズムは更に高度な計算となっており、解像度の低下は、CFA無しの場合とくらべてもほとんど劣ることはないです。試しに、RawTherapeeでVNGやAHDなどを使った場合と、キャノンのDPPを実際に使って比較すると、カメラメーカーの画像処理技術はアマチュアの無料ソフトの比では無いことが理解できますよ。まずは、簡単なVNG法あたりを勉強なさるほうが良いと思います。
Commented by supernova1987a at 2019-06-11 03:56
> 天文ファンさん
なるほど、ディベイヤーの方法にも色々あるのですね。
ただ、今回の検証ごっこは、カラー冷却CMOSカメラを用いて撮影した場合にモノクロ冷却CMOSカメラを用いた画像よりも格段に解像度が低くなる原因を推測するのが目的ですので、極力シンプルな補完を心がけました。

ステライメージでカラー冷却CMOSカメラを処理した際に生じるダークノイズのカラー揺らぎの描像や、デモザイク前後のノイズ揺らぎ量変化などが、このモデルにより、比較的よく再現できているので、あながち間違ってはいないと思うのですが・・・・。
Commented by 天文ファン at 2019-06-11 20:45 x
「周りの4つの平均値を代入」というのは、ノイズリダクションの基本的なカーネルなので、ノイズが減るのは当然なのです。空間周波数が低くなる方向の操作ですから。このアルゴリズムでは、NRも同時に掛けているのと一緒です。
ちなみに、
ディベイヤーで一番難しいのは、「ノイズをノイズとして再現する事」じゃないかと思います。
そういう観点で見ると、アマチュアに流通している無料現像ソフトでその点が満足できるものは存在していないように感じています。フォトショップは、DCRAWを使っているので、ノイズの再現性が実はあまり良くないのです。
この点ではメーカー製(特にキャノン)を超えるものは無いんじゃないかと良く思います。
ノイズをノイズらしく再現するためには、高周波再現がかなり良くないと出来ないと思います。
ほとんどの現像ソフトは、ディベイヤーの過程で、ノイズはごまかされて曖昧になってしまうように見えます。
天体写真のように数十枚のコンポジットをするのであれば、そのあたりの弊害はずっと減るのは確かです。
ちなみに、僕はカラーセンサーであってもセンサーのナイキスト周波数までの解像力は再現できているように見えますけどね。カラー情報は飛び飛びでも白黒の観点で見るとそれなりの空間情報が潜んでいるからです。
Commented by supernova1987a at 2019-06-11 23:32
> 天文ファンさん
返事ありがとうございます。
まさにおっしゃるとおりで、ノイズ処理においては、その再現性は重要だと認識しています。手持ちの環境下ではベイヤーボケに伴う不具合を避けるため、主なノイズ処理(アンプグロー・ホットピクセル・クールピクセルなどの補正)に関してはディベイヤー前に行うようにしています。個人的にノイズを攪拌して誤魔化すのが嫌いだからです。
今のところカラーカメラは主として色情報の取得用とし、輝度情報はモノクロカメラを用いているため、不具合は感じていないのですが、キヤノンのDPP並みにカラーFITSをディベイヤーするソフトがあれば夢が広がりますね。輝線スペクトルが優位な対象はともかく、一般的な対象ならモノクロカメラが不要になるかもしれません。
もっとも、それ以前にシンチレーションの影響が大きいので、星雲の場合でも数百枚のコンポジットとデコンボリューションが手放せないのが悩みですが・・・。
名前
URL
削除用パスワード
by supernova1987a | 2016-09-08 00:37 | 天体写真 | Comments(6)

あぷらなーとの写真ブログ


by あぷらなーと