程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

SIFT關鍵點檢測和特征匹配(python實現)

編輯:Python

文章目錄

    • 1.Harris和Shi-Tomasi特征檢測
    • 2.SIFT(Scale-Invariant Feature Transform)關鍵點檢測
    • 3.SIFT使用過程
      • (1)創建SIFT對象
      • (2)進行檢測,(關鍵點)KP=sift.detect(img,……)
      • (3)繪制關鍵點,drawKeypoints(gray,KP,img)
    • 4.代碼實戰
    • 5.特征匹配
      • (1)方式一:關鍵點匹配
      • (2)方式二:關鍵點匹配

1.Harris和Shi-Tomasi特征檢測

Harris: https://blog.csdn.net/Keep_Trying_Go/article/details/125384144
Shi-Tomasi:https://blog.csdn.net/Keep_Trying_Go/article/details/125384218


2.SIFT(Scale-Invariant Feature Transform)關鍵點檢測

思考:既然有了Harris角點檢測,為什麼還要SIFT關鍵點檢測呢?
(1)Harris角點具有旋轉不變性的特性;但是縮放後,原來的角點有可能不一定為角點了;

可以看到當第一幅圖的角點放大之後,就變成了第二幅圖的樣子,但是再去檢測的時候已經不能檢測出是角點了,而是邊沿了。所以提出了SIFT。


3.SIFT使用過程

(1)創建SIFT對象

(2)進行檢測,(關鍵點)KP=sift.detect(img,……)

(3)繪制關鍵點,drawKeypoints(gray,KP,img)

其中gray——原始圖像,可以使三通道或單通道圖像;KP——關鍵點;img——將點繪制到原始圖像上;color——繪制的特征點的顏色信息,默認繪制的是隨機彩色;
Flags——
(1)cv2.DRAW_MATCHES_FLAGS_DEFAULT:創建輸出圖像矩陣,使用現存的輸出圖像繪制匹配對和特征點,對每一個關鍵點只繪制中間點
(2)cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不創建輸出圖像矩陣,而是在輸出圖像上繪制匹配對
(3)cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:對每一個特征點繪制帶大小和方向的關鍵點圖形
(4)cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:單點的特征點不被繪制


4.代碼實戰

import os
import cv2
import cv2
img=cv2.imread('images/HaLiSi.jpg')
img=cv2.resize(src=img,dsize=(450,450))
gray=cv2.cvtColor(src=img,code=cv2.COLOR_BGR2GRAY)
#SIFT對象創建
sift=cv2.SIFT_create()
#進行檢測,其中第二個參數為None,表示對整張圖進行檢測
kp=sift.detect(gray,None)
#繪制角點
cv2.drawKeypoints(image=gray,keypoints=kp,outImage=img,color=(0,255,0))
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
print('pycharm')


5.特征匹配

(1)關鍵點:位置,大小和方向;
計算SIFT描述子:
(2)記錄了關鍵點周圍對其貢獻的像素點的一組向量值,其不受仿射變換,光照變換等的影響。

(1)方式一:關鍵點匹配

關鍵點匹配:
#方式一:進行特征匹配
kp,des=sift.compute(img,kp)
import os
import cv2
import numpy as np
img=cv2.imread('images/HaLiSi.jpg')
img=cv2.resize(src=img,dsize=(450,450))
gray=cv2.cvtColor(src=img,code=cv2.COLOR_BGR2GRAY)
#SIFT對象創建
sift=cv2.SIFT_create()
#進行檢測,其中第二個參數為None,表示對整張圖進行檢測
kp=sift.detect(gray,None)
#進行特征匹配
kp,des=sift.compute(gray,kp)
print(des)
# kp,des=sift.detectAndCompute(gray)
#繪制角點
cv2.drawKeypoints(image=gray,keypoints=kp,outImage=img,color=(0,255,0))
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
print('Pycharm')

(2)方式二:關鍵點匹配

同時進行關鍵點檢測和特征匹配
Kp,des=sift.detectAndCompute(img,None)
Img:輸入的圖像(灰度圖);
Mask:指定img中哪個區域進行計算。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved