LoginSignup
9
9

More than 3 years have passed since last update.

OpenCVのSIFTで特徴抽出してみた

Last updated at Posted at 2020-01-20

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 : 図形描画機能の識別設定

入力画像
dog.jpeg

出力画像

sift_img.jpg

参考文献

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9