SIFT記述子
局所領域の内容を認識に有利な情報に変換する過程を記述という。
記述された情報を記述子という。
SIFT記述子は、局所輝度勾配ヒストグラムを利用した記述子である。
SIFTは、DoG画像の生成や画像のリサイズなどの処理が必要なため、計算コストが高いという問題がある。
大まかなアルゴリズム
- DoG画像の極値から特徴点候補を求めて、エッジやコントラストをもとにロバストな特徴点を選出する
- 特徴点の近傍でのDoG画像の勾配方向から勾配ヒストグラムを作成し、スケールと主方向を決定する(スケール不変性)
- 特徴点の近傍領域を主方向に合わせて回転する(回転不変性)
- 回転後の画像から勾配ヒストグラムを作成、総和をもとに正規化して特徴ベクトルとする(明度不変性)
論文
distinctive image features from scale-invariant keypoints
Python+OpenCV
import cv2 import numpy as np img = cv2.imread('haruna_kankore.png') gray=cv2.imread('haruna_kankore.png',0) sift = cv2.xfeatures2d.SIFT_create() kp = sift.detect(gray) img_sift = np.zeros_like(img) img_sift = cv2.drawKeypoints(img, kp, img_sift, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imwrite('img_sift.png', img_sift)
結果
元画像
SIFT記述子
プログラム+α
import cv2 img = cv2.imread('haruna_kankore.png') detector = cv2.xfeatures2d.SIFT_create() kp = detector.detect(img) img_sift = cv2.drawKeypoints(img, kp, None) cv2.imwrite("img_sift.png", img_sift)
特徴点のマッチング
import cv2 img1 = cv2.imread('haruna_kankore.png') img2 = cv2.imread('haruna_kankore_temp.png') sift = cv2.xfeatures2d.SIFT_create(500) kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) bf = cv2.BFMatcher() matches = bf.knnMatch(des1,des2, k=2) good = [] for m,n in matches: if m.distance < 0.75*n.distance: good.append([m]) img_sift = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good, None, flags=2) cv2.imwrite('img_sift_match.png', img_sift)
元画像
切り出し
SIFT記述子
参考
http://lang.sist.chukyo-u.ac.jp/classes/OpenCV/py_tutorials/py_feature2d/py_sift_intro/py_sift_intro.html
http://lang.sist.chukyo-u.ac.jp/classes/OpenCV/py_tutorials/py_feature2d/py_surf_intro/py_surf_intro.html
This project is abandoned — Abandoned project 1.0 documentation
https://www.tech-tech.xyz/sift-surf-akaze/