サブピクセルレベルのローカライズ
出典: Wikimura
SURFではHessian画像の極大値を(x,y,s)空間(sは画像のスケール)で探す。 スケールを高くする際、サンプリング間隔を大きく取るため、極大点の精度が悪くなってしまう。 そこで「Distinctive Image Features from Scale-Invariant Keypoints」で紹介されている方法が使われる。
これは、スカラー関数であるHessian画像を、極大点
の周りで2次近似し、その極大値を求めるというアプローチとなっている。(二次微分のところの書き方は本当はNGらしい)
目次 |
原理
三次元空間で定義されるスカラー関数を、極大点付近で二次近似する。
近似したら、これが極大値を取る場所を探す。極大点では勾配が0となるので、次式を解けば良いことになる。
結果は以下のようになる。
差分近似
勾配ベクトルは、中央差分を使って以下のように表せる。
Hessianは以下のように表せる。
計算を楽にする
実際に計算する際は、勾配とHessianを求めることから始める。 この段階で、Δx,Δy,Δzの除算が必要になる。 しかし、これらは打ち消しあうため、もう少し計算量を減らせる。(あまり全体に効果はないかもしれない...)
ここで、以下の行列を定義する。
これを使うと、勾配は以下のように表せる。
Hessianは以下のようにあらわせる。
これらを使えば、以下の形になる。
ここで、Sの逆行列は次式で表される。これは予め計算しておける。また、GSLならベクトルの成分ごとの積を使えば良いので、実際には計算量は3回の乗算にしかならない。
x'Axの微分
二次形式を微分する場合、以下が成り立つらしい。(Aは定数行列)
行列を使っていても、積の微分のルールはそのまま使えるのだが...普通の微分の感覚だと以下のようになってしまう?第一項は行ベクトル、第二項は列ベクトルになるので、もちろんこれはだめ。
ベクトルのまま考えるためには、少し変形がいるらしいが...良く分からない。 アインシュタインの縮約ではないが、∑が面倒なので省略して考えてみる。
これなら、微分は...
これで良いのだろうか?

