9
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

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

参考文献

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
9
Help us understand the problem. What are the problem?