天文写真のブログをやっていると避けて通れないのが画像処理です。
いつもは撮った写真をステライメージやペイントブラシなんかで加工して載せておしまいです。

先週、放送大学で画像認識の講座がたまたま目に入り、ちょっと面白かったので色々検索を始めたところ、ほったらかしになっていたテトラを思い出しました。(うち奥がいくつか放送大学の講義を受講していて録画が入ると録画機器のチャンネルがそのままになり、TVをつけたとき面白い講義がやっているとついそのまま見る、というパターンが多いのです^^;)

最近のブログ記事でもセッピーナさんが写真の歪曲収差を取り除くことをやられていて、写真から星を見つけるプログラムへの熱意が湧き上がってきました。

画像認識は最近では自動車に組み込まれていて、縁石や壁や標識、人間をリアルタイムに認識したりして身近な技術になってきましたが、その原理や処理方法なんて私はまったく知らないわけです。画像は一般的にRGBの数値の羅列であり、人間の目にはすぐわかってもコンピュータには何の意味もありません。
放送大学では「SIFT特徴量」という言葉を残してあまり説明せずに終了しました。どうもこれを使うと、画像の回転や拡大縮小、平行移動などが起きていても同一の画像であることが認識できるらしいということだけわかりました。

例えば、手持ちの「止まれ」の道路標識画像と、走行中に取得した画像を見比べて「止まれ」標識が存在するか見つけることができるようです。

調べてるうちに、画像にある物体のエッジ(ふち)やコーナー(かど)を見つけるのに様々な方法が考案されていることもわかってきました。

画像の特徴点を探すためにまずしなければならないことは、

1.画像の雑音を無くす→ガウシアンフィルタを使う
2.微分してエッジを検出する→DoG(Difference of Gaussian)画像を作る

ことみたいです。星の位置決定に使えるか実はまだよくわかってないのですが、輪郭が捉えられるなら使えそうな気がしています。ちなみに教科書はこれです→FLAB

フィルタっていうのは画像処理ソフトに出てくるこんなやつのことです。


ガウシアンフィルタはこのsmoothに似た値分布を持つフィルタで(プログラムではきちんと演算して求めます)、画像にかけてみる(畳み込む)とボケが発生します。
このボケが背景を平滑化して微分したときに小さな値となってエッジ以外を捨てるのに役立つようです。
※フィルタをかけるというのはある点の値を周りの値と掛け算合計して割り算するということです。この例ではセンターには5を掛けて、周り8つの値を足して(1掛けたものを8つ足す)、最後に13で割ったものが新しいそのピクセルの値となります。

さっそくプログラムで画像にガウシアンフィルタをかけてみたかったのですが、たくさんの壁がありました。

対象とする画像ファイルの選定 → .bmp ファイルなら無圧縮で Windows では一般的
.bmp ファイルのフォーマット → Wikipedia で確認。ヘッダ54バイト+RGB3バイトx画素数
構造体のアラインメント → gccのコンパイル指定が無さそうなのでハマりました;;

bmp ファイルをバイナリエディタで見てみるとこんな風になってます。最初の二文字は「BM」で次の4バイトにファイルサイズが入ってます。
42 4D = B M
36 A3 02 00 = 2A336H →172854バイト


240x240サイズのこんな画像をペイントで書いてみて


作ったプログラムに食わせてみます。
$ a.exe 240.bmp 240g.bmp
magic:BM fsiz:172854, reserve:0, offset:54, Bmfh:54
Wsiz=7, R=3
msk[0]=0.004432
msk[1]=0.053991
msk[2]=0.241971
msk[3]=0.398942
msk[4]=0.241971
msk[5]=0.053991
msk[6]=0.004432



すると、こんな風に輪郭にボケが出ました。


いまのところGチャンネルだけ取り出して書き戻すことをやっているので(星の検出だけなので色は関係ない)結果はグレイスケールならぬグリーンスケールです^^;

ファイルを読み込んで、ガウシアンフィルタをかけて、結果を書き出す、というところまでこの2日間でなんとかできました。
もちろんいろんなサイトを参考にしました。

目標は星の輪郭を取り出して中心を見つけることです。それがわかればテトラを使って撮影方向の赤経/赤緯がわかります。
撮り貯めた星の画像をバッチ処理ですべてBMPに変換(これはすでにある)、カメラを向けた方向(赤経/赤緯)をJPG画像ファイルに書き足す、なんてことができたらいいなーと妄想中です。