簡単な解説が欲しいとの要望にお応えして、今回の概要をまとめてみます。
こんな40x40の星の写真、中心座標を求めたいとします。
コンピュータには目があるわけでは無いので画像はただの数値の羅列です。
どんな計算をしたらその場所にたどり着くか説明してみます。
本当は画像なので縦横2次元なのですが、面倒なのでX方向横1次元でいきます。
先の画像を縦横とも4倍にして、黄色い線を書いてみました。
まだわかりにくいと思うのでグラフにしたのがこれ。
24ビットビットマップファイルはRGBそれぞれ0~255の範囲の値を3つ組み合わせてたったひとつの点の色を表しています。
このグラフはX方向は画像横幅0~39、高さ(=輝度)は0~255の範囲をとります。
ちょっと富士山のような形です。宝永山まであったりして。
この山の中心は20~22のあたりにありそうですが、どうやって見つけるのかが問題です。
この山を扱い易いよう変形してしまいます。そこで使われるのがガウシアンフィルタです。
ガウシアンフィルタにはひとつだけパラメータがあり、それによってフィルタの直径が変わります。大きいパラメータを使うとより画像をボカす働きがあります。
小さなパラメータ(=1.6)のとき
大きなパラメータ(=3.2)のとき
急に緑色の画像になっていますが、これは輝度だけが問題なので元画像の緑色部分を抜き出して、そこにガウシアンフィルタをかけたからです。
こうして画像はボケますが、微分したときに結果が滑らかになります。何にもしないと画素にあるゴミ(画素欠けやホワイトノイズ)のところで特大の傾きが計算結果として出てきてしまい、誤検出につながります。
あとはこれを2回微分したら輪郭や中心の候補が選べるようになります。私の頭の中にあるイメージを図にしてみました。←頭の中で微分した図形なので突っ込みは無しでm(_ _ )m
(19:58↓間違いを訂正しました)
この結果から極値(最大値か最小値)の点を取ってきて特徴点の候補にします。
上のグラフで候補が5~7つくらいありそうだとわかると思います。
※実際はもっとたくさんの差分平面データを作って求めています。説明省略してます。
その後、エッジ(この場合、星の輪郭)にある候補は別の計算によりふるい落としてしまいます。
残ったのが星の中心座標です。
ピクセル座標でいうと20が極大値となっているのがわかると思います。
しかし山の頂点は19と20の間にありそうな感じです。
そこで、サブピクセル位置推定を行います。山の頂上のX座標を求めます(ちなみに、それ故スケール4倍は無関係です)。
19のところの値は -60
20のところの値は -56
21のところの値は -68
これらの3つの値を通過する2次方程式を見つけて極値になるときのX座標を計算するということです。
X = (-60 + 68)/(2 * (-60 - 2 * (-56) -68)) = -0.01667
20 - 0.01667 = 19.833
どうやら 19.9833 あたりに星の中心があるようです。
簡単にまとめようとしましたがあんまりよくまとまってない気もします。
詳しい解説はネットに溢れているので、取っ掛かりくらいになればよいかと思います。
「薄目で見たときとカッと見開いて見たときの輝度差でコントラストの小さいところが中心だ」
なんて人間の目に例えてみても、却ってよくわかりませんね;;
こんな40x40の星の写真、中心座標を求めたいとします。
コンピュータには目があるわけでは無いので画像はただの数値の羅列です。
どんな計算をしたらその場所にたどり着くか説明してみます。
本当は画像なので縦横2次元なのですが、面倒なのでX方向横1次元でいきます。
先の画像を縦横とも4倍にして、黄色い線を書いてみました。

この黄色い線方向に、実際にファイルの中から読み取った値がこれ。緑の輝度だけを取り出しています。
------------------------------------------------------------------------
31,34,37,34,28,2D,45,56,5F,69,88,94,B1,CF,E8,FF,FC,FE,FC,FF,FF,FB,FE,FF,FF,FF,F3,B3,91,9E,85,63,41,3D,33,33,2B,25,27,2C
16進数で読みづらいという方向けに10進数に変換したのがこれ。
------------------------------------------------------------------------
49,52,55,52,40,45,69,86,95,105,136,148,177,207,232,255,252,254,252,255,255,251,254,255,255,255,243,179,145,158,133,99,65,61,51,51,43,37,39,44
まだわかりにくいと思うのでグラフにしたのがこれ。
24ビットビットマップファイルはRGBそれぞれ0~255の範囲の値を3つ組み合わせてたったひとつの点の色を表しています。
このグラフはX方向は画像横幅0~39、高さ(=輝度)は0~255の範囲をとります。
ちょっと富士山のような形です。宝永山まであったりして。
この山の中心は20~22のあたりにありそうですが、どうやって見つけるのかが問題です。
この山を扱い易いよう変形してしまいます。そこで使われるのがガウシアンフィルタです。
ガウシアンフィルタにはひとつだけパラメータがあり、それによってフィルタの直径が変わります。大きいパラメータを使うとより画像をボカす働きがあります。
小さなパラメータ(=1.6)のとき
大きなパラメータ(=3.2)のとき
急に緑色の画像になっていますが、これは輝度だけが問題なので元画像の緑色部分を抜き出して、そこにガウシアンフィルタをかけたからです。
こうして画像はボケますが、微分したときに結果が滑らかになります。何にもしないと画素にあるゴミ(画素欠けやホワイトノイズ)のところで特大の傾きが計算結果として出てきてしまい、誤検出につながります。
あとはこれを2回微分したら輪郭や中心の候補が選べるようになります。私の頭の中にあるイメージを図にしてみました。←頭の中で微分した図形なので突っ込みは無しでm(_ _ )m
(19:58↓間違いを訂正しました)
この最終形にするフィルタがLoG(ラプラシアン・オブ・ガウシアン)と言って、ガウシアンの2階微分の形になってます。実際は計算コストが高いからLoGは使いたいけど使わないそうです。
で、代わりに使うのがDoG(ディファレンス・オブ・ガウシアン)と言って、詳細は論文を見てもらうとして、ガウシアンパラメータの異なる画像どうしを引き算するとLoGの近似になるそうで、これが比較して計算が少ない(=速い)。DoGはLoGの近似として使えるのでそれで済まします。
この結果から極値(最大値か最小値)の点を取ってきて特徴点の候補にします。
上のグラフで候補が5~7つくらいありそうだとわかると思います。
※実際はもっとたくさんの差分平面データを作って求めています。説明省略してます。
その後、エッジ(この場合、星の輪郭)にある候補は別の計算によりふるい落としてしまいます。
残ったのが星の中心座標です。
ピクセル座標でいうと20が極大値となっているのがわかると思います。
しかし山の頂点は19と20の間にありそうな感じです。
そこで、サブピクセル位置推定を行います。山の頂上のX座標を求めます(ちなみに、それ故スケール4倍は無関係です)。
19のところの値は -60
20のところの値は -56
21のところの値は -68
これらの3つの値を通過する2次方程式を見つけて極値になるときのX座標を計算するということです。
X = (-60 + 68)/(2 * (-60 - 2 * (-56) -68)) = -0.01667
20 - 0.01667 = 19.833
どうやら 19.9833 あたりに星の中心があるようです。
簡単にまとめようとしましたがあんまりよくまとまってない気もします。
詳しい解説はネットに溢れているので、取っ掛かりくらいになればよいかと思います。
「薄目で見たときとカッと見開いて見たときの輝度差でコントラストの小さいところが中心だ」
なんて人間の目に例えてみても、却ってよくわかりませんね;;




