目录
一、题目
二、原理
SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points)及其有关scale 和 orientation 的描述子得到特征并进行图像特征点匹配,获得了良好效果。
SIFT算法的特点有:
(1) SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
(2) 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
(3) 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
(4) 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
(5)可扩展性,可以很方便的与其他形式的特征向量进行联合。
三、效果
原图:
效果:
(1)img_a.jpg同img_b.jpg进行灰度处理并合并,形成img1.jpg
(2)画出img_a.jpg和img_b.jpg的特征点并用红圈标出,并合并,形成img2.jpg
(3)在cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)下的匹配效果,形成img3.jpg
四、代码
import numpy as np
import cv2
from matplotlib import pyplot as plt
imgname1 = 'img_a.jpg'
imgname2 = 'img_b.jpg'
sift = cv2.xfeatures2d.SIFT_create()
img1 = cv2.imread(imgname1)
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #灰度处理图像
kp1, des1 = sift.detectAndCompute(img1,None) #des是描述子
img2 = cv2.imread(imgname2)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)#灰度处理图像
kp2, des2 = sift.detectAndCompute(img2,None) #des是描述子
hmerge = np.hstack((gray1, gray2)) #水平拼接
cv2.imshow("gray", hmerge) #拼接显示为gray
cv2.imwrite('img1.jpg', hmerge)
cv2.waitKey(0)
img3 = cv2.drawKeypoints(img1,kp1,img1,color=(255,0,255)) #画出特征点,并显示为红色圆圈
img4 = cv2.drawKeypoints(img2,kp2,img2,color=(255,0,255)) #画出特征点,并显示为红色圆圈
hmerge = np.hstack((img3, img4)) #水平拼接
cv2.imshow("point", hmerge) #拼接显示为gray
cv2.imwrite('img2.jpg', hmerge)
cv2.waitKey(0)
# BFMatcher解决匹配
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)
# 调整ratio
good = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good.append([m])
img5 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
cv2.imshow("BFmatch", img5)
cv2.imwrite('img3.jpg', img5)
cv2.waitKey(0)
cv2.destroyAllWindows()