前回は特徴点を見つけるところまで組みました。

今日は特徴点の絞込み、つまり不向きな点を削除する部分を書きました。

そのまま論文に沿って進めると
・主曲率の計算
 - 大きいものはエッジに存在するので削除。コーナーに存在する特徴点は主曲率が小さい
・コントラストの計算 
 - 小さいものは誤差の可能性や変形に弱いので削除。これはX、Y方向のみでなくガウシアンのスケール方向にもコントラストを計算します。
をやればよいみたいです。

SIFTを1から組むブログ」に大変お世話になりました。
というよりほとんどC言語に焼きなおしただけかも。

BMPファイルの各ピクセルが0-255の値を取るのに対して、サンプルでは0-1の値を取るPGMファイルを扱っていることから、そのまま書いていたらまったく役に立たないプログラムになってしまいました。このことに気が付いて修正(値の正規化)したところ、とてもすばらしい結果を得ました。

元画像:


今日の結果:



今度は実際の星の画像、冥王星を写したときのもの:


昨日までのプログラムですと、特徴点が1573個出現:


今日のプログラム結果画像:

1523個が削除されて、残り50個になりました。

左下を2倍に拡大して、赤で特徴点を強調してみました。


今回のプログラムの出力は、当然座標リスト形式にもなるので、テトラへの入力に最適です。
実際のプログラム出力(冥王星写真対象):
1573 found
1523 deleted
[0][0](200,596),[0][0](140,590),[0][0](472,590),[0][0](115,570),[0][0](32,560),[
0][0](226,553),[0][0](597,545),[0][0](411,438),[0][0](202,436),[0][0](3,409),[0]
[0](426,381),[0][0](28,373),[0][0](2,356),[0][0](249,338),[0][0](53,337),[0][0](
262,315),[0][0](495,248),[0][0](437,246),[0][0](18,226),[0][0](489,195),[0][0](1
72,192),[0][0](98,190),[0][0](216,184),[0][0](526,183),[0][0](523,178),[0][0](40
6,177),[0][0](536,155),[0][0](276,136),[0][0](597,134),[0][0](411,84),[0][0](369
,75),[0][0](43,63),[0][0](578,61),[0][0](2,51),[0][0](81,40),[0][0](320,39),[0][
0](3,18),[0][0](14,16),[0][0](309,14),[0][0](437,10),[0][1](107,431),[0][1](536,
423),[0][1](509,399),[0][1](377,227),[0][1](415,184),[0][1](502,62),[0][2](119,7
4),[1][1](228,577),[1][1](80,473),[1][2](8,17),


重複する特徴点を取り除いたり、背景に特徴点が現れたりする場合もあるのでヒストグラム形式での候補選択を組み合わせるだけでほとんど完成かも知れません。