#SIFTとは
- SIFT(Scale-Invariant Feature Transform)
- 特徴点の検出と特徴量の記述を行います。
- 特徴: 拡大縮小に強い、回転に強い、照明変化に強い。
###SIFTのアルゴリズム
#####【特徴点の検出】
1-1. 特徴点となる候補点の探索
1-2. 候補点の絞り込み
#####【特徴量の記述】
2-1. 各特徴点の勾配を検出
2-2. 各特徴点の勾配方向ヒストグラム計算
####1-1. 特徴点となる候補点の探索
スケール方向の差分画像(DoG画像)において、極値を取る点を特徴点とする。簡単にまとめると、2次元(x,y)である画像に、スケールという次元を加えて3次元にする。スケールはどうやって決めるかというと画像(x,y)を、ある量σだけ平滑化した(x,y,σ)を考える。平滑化にはガウシアンフィルタを使う。このデータを使って、特徴点となる候補を洗い出す。変化量が大きいってことは、情報量が多い。
####1-2. 候補点の絞り込み
DoG画像の出力値は、(x,y,σ)を変数とする関数なので、それを特徴点周りで近似してやり、その近似式の導関数とかを使って、極値をとる点を算出し直すってこと。エッジ上の点は除外。DoG出力値が小さいものを除外。
####2-1. 各特徴点の勾配を検出
- 特徴点の周りで輝度勾配ヒストグラムを作成
- 方向・強度の計算はHoGとほぼ同じ
- 方向は36方向
ポイント
強度は、特徴点のスケールのガウシアンフィルタで重み付け。
⇒スケール変化に強くなる。
- 求めたヒストグラムにて、強度が最大値の80%を超える方向を、この特徴点の方向と定める。
####2-2. 各特徴点の勾配方向ヒストグラム計算
- 特徴点の方向を基準の方向として、再度、輝度勾配ヒストグラムを作成する(回転に強い)
- 方向は8方向(45度ずつ)
- 4x4x8 = 128次元の特徴量
- 正規化もする(これにより照明変化に強くなる)
#SIFTのコード
サンプルコードです。
import cv2
import numpy as np
img = cv2.imread('dog.jpg')
sift = cv2.xfeatures2d.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(img, None)
img_sift = cv2.drawKeypoints(img, keypoints, None, flags=4)
cv2.imwrite("sift_img.jpg",img_sift)
- image : 入力画像
- keypoints : 入力画像から得られたキーポイント
- flags : 図形描画機能の識別設定
出力画像
#参考文献