SIFT特征图像匹配

import numpy as np
import cv2
from matplotlib import pyplot as plt
 
MIN_MATCH_COUNT = 10 #设置最低特征点匹配数量为10
template = cv2.imread('./logo/logo7.png',0) # queryImage
target = cv2.imread('logo1.png',0) # trainImage
# Initiate SIFT detector创建sift检测器
#sift = cv2.xfeatures2d.SIFT_create()
sift = cv2.xfeatures2d.SURF_create()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(template,None)
kp2, des2 = sift.detectAndCompute(target,None)
#创建设置FLANN匹配
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1,des2,k=2)
# store all the good matches as per Lowe's ratio test.
good = []
#舍弃大于0.7的匹配
#print(matches)
for m,n in matches:
    if m.distance < 0.5*n.distance:
        #print(m.distance,n.distance)
        good.append(m)
if len(good)>MIN_MATCH_COUNT:
    # 获取关键点的坐标
    src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
    dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)
    #计算变换矩阵和MASK
    M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
    matchesMask = mask.ravel().tolist()
    h,w = template.shape[:2]
    # 使用得到的变换矩阵对原图像的四个角进行变换,获得在目标图像上对应的坐标
    pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)
    dst = cv2.perspectiveTransform(pts,M)
    cv2.polylines(target,[np.int32(dst)],True,0,2, cv2.LINE_AA)
    print('匹配点个数为:',len(good))
else:
    print( "Not enough matches are found - %d/%d" % (len(good),MIN_MATCH_COUNT))
    matchesMask = None
draw_params = dict(matchColor=(0,255,0), 
                   singlePointColor=None,
                   matchesMask=matchesMask, 
                   flags=2)
result = cv2.drawMatches(template,kp1,target,kp2,good,None,**draw_params)
plt.imshow(result, 'gray')
plt.show()
print(len(good))
#pip install opencv-contrib-python==3.4.2.16 -i  https://pypi.mirrors.ustc.edu.cn/simple/

 

SIFT(Scale-Invariant Feature Transform)算法是一种在计算机视觉中常用的特征提取算法,具有尺度不变性、旋转不变性和光照不变性等优良特性。以下是MATLAB实现SIFT特征图像匹配算法的步骤: 1. 读取待匹配的两幅图像,将其转化为灰度图像。 2. 利用SIFT算法提取两幅图像的特征点及其描述子。MATLAB中可以使用vlfeat工具箱中的vl_sift函数实现。 3. 利用Match函数对两幅图像的特征点进行匹配,得到匹配点的坐标。Match函数可以使用MATLAB自带的matchFeatures函数实现。 4. 对匹配点进行筛选,剔除误匹配的点。常用的方法有基于距离的筛选方法和基于几何关系的筛选方法。MATLAB中可以利用ransac函数实现基于几何关系的筛选。 5. 绘制匹配结果图像。利用MATLAB中的imshow、hold on、plot等函数可以实现。 下面是一个简单的MATLAB实现示例: ```matlab % 读取待匹配的两幅图像 img1 = imread('img1.jpg'); img2 = imread('img2.jpg'); % 将图像转化为灰度图像 gray1 = rgb2gray(img1); gray2 = rgb2gray(img2); % 提取两幅图像的SIFT特征点及其描述子 [f1, d1] = vl_sift(single(gray1)); [f2, d2] = vl_sift(single(gray2)); % 对两幅图像的特征点进行匹配 [indexPairs, matchMetric] = matchFeatures(d1', d2'); % 剔除误匹配的点 [f1, f2] = ransac(f1(1:2, indexPairs(1,:))', f2(1:2, indexPairs(2,:))'); % 绘制匹配结果图像 imshow([img1 img2]); hold on; plot(f1(:,1), f1(:,2), 'go'); plot(f2(:,1)+size(img1,2), f2(:,2), 'ro'); for i = 1:size(f1,1) plot([f1(i,1) f2(i,1)+size(img1,2)], [f1(i,2) f2(i,2)], 'b-'); end ``` 需要注意的是,SIFT算法涉及到许多参数的设置,如特征检测中的尺度空间参数、特征点描述子中的方向直方图参数等。这些参数的设置对算法的性能和结果影响很大,需要根据具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图灵追慕者

您的支持是我写作分享最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值