python图像相似度识别_一个用SIFT特征比较图像相似度的python小程序

1 问题描述

把一堆图片按照与给出的一张图片的相似度进行排序

2 程序

可以从图片中提取SIFT特征,对两幅图片的SIFT特征进行匹配并按照一定条件删选就能得到两幅图片的匹配点个数,匹配点个数越多,相似度越高

import cv2

from matplotlib import pyplot as plt

import numpy as np

import os

import math

def getMatchNum(matches,ratio):

'''返回特征点匹配数量和匹配掩码'''

matchesMask=[[0,0] for i in range(len(matches))]

matchNum=0

for i,(m,n) in enumerate(matches):

if m.distance

matchesMask[i]=[1,0]

matchNum+=1

return (matchNum,matchesMask)

path='D:/CodeProjects/AnacondaSamples/HandleImages/'

queryPath=path+'QueryImages2/' #图库路径

samplePath=path+'SampleImages/sample2.jpg' #样本图片

comparisonImageList=[] #记录比较结果

#创建SIFT特征提取器

sift = cv2.xfeatures2d.SIFT_create()

#创建FLANN匹配对象

FLANN_INDEX_KDTREE=0

indexParams=dict(algorithm=FLANN_INDEX_KDTREE,trees=5)

searchParams=dict(checks=50)

flann=cv2.FlannBasedMatcher(indexParams,searchParams)

sampleImage=cv2.imread(samplePath,0)

kp1, des1 = sift.detectAndCompute(sampleImage, None) #提取样本图片的特征

for parent,dirnames,filenames in os.walk(queryPath):

for p in filenames:

p=queryPath+p

queryImage=cv2.imread(p,0)

kp2, des2 = sift.detectAndCompute(queryImage, None) #提取比对图片的特征

matches=flann.knnMatch(des1,des2,k=2) #匹配特征点,为了删选匹配点,指定k为2,这样对样本图的每个特征点,返回两个匹配

(matchNum,matchesMask)=getMatchNum(matches,0.9) #通过比率条件,计算出匹配程度

matchRatio=matchNum*100/len(matches)

drawParams=dict(matchColor=(0,255,0),

singlePointColor=(255,0,0),

matchesMask=matchesMask,

flags=0)

comparisonImage=cv2.drawMatchesKnn(sampleImage,kp1,queryImage,kp2,matches,None,**drawParams)

comparisonImageList.append((comparisonImage,matchRatio)) #记录下结果

comparisonImageList.sort(key=lambda x:x[1],reverse=True) #按照匹配度排序

count=len(comparisonImageList)

column=4

row=math.ceil(count/column)

#绘图显示

figure,ax=plt.subplots(row,column)

for index,(image,ratio) in enumerate(comparisonImageList):

ax[int(index/column)][index%column].set_title('Similiarity %.2f%%' % ratio)

ax[int(index/column)][index%column].imshow(image)

plt.show()

3 效果

样本图片:

需要排序的图片:

排序结果:

---------------------

作者:皇家园林巡游者

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值