Vous voudrez peut-être jeter un œil à la correspondance des fonctionnalités. L'idée est de trouver des fonctionnalités dans deux images et de les faire correspondre. Cette méthode est couramment utilisée pour trouver un modèle (par exemple un logo) dans une autre image. Une caractéristique, en substance, peut être décrite comme des choses que les humains trouveraient intéressantes dans une image, comme des coins ou des espaces ouverts. Il existe de nombreux types de techniques de détection de fonctionnalités, mais ma recommandation est d'utiliser une transformation de caractéristique invariante à l'échelle (SIFT) comme algorithme de détection de fonctionnalité. SIFT est invariant à la translation d'image, à l'échelle, à la rotation, partiellement invariant aux changements d'éclairage et robuste à la distorsion géométrique locale. Cela semble correspondre à vos spécifications où les images peuvent avoir des rapports légèrement différents.
Compte tenu des deux images que vous avez fournies, voici une tentative de faire correspondre les fonctionnalités à l'aide de l' outil de mise en correspondance des fonctionnalités FLANN . Pour déterminer si les deux images sont identiques, nous pouvons la baser sur un certain seuil prédéterminé qui suit le nombre de correspondances qui réussissent le test de rapport décrit dans Caractéristiques distinctives de l'image à partir de points clés invariants à l'échelle par David G. Lowe . Une explication simple du test est que le test de rapport vérifie si les correspondances sont ambiguës et doivent être supprimées, vous pouvez le traiter comme une technique de suppression des valeurs aberrantes. Nous pouvons compter le nombre de correspondances qui réussissent ce test pour déterminer si les deux images sont identiques. Voici les résultats de correspondance des fonctionnalités:
Matches: 42
Les points représentent toutes les correspondances détectées tandis que les lignes vertes représentent les «bonnes correspondances» qui réussissent le test de rapport. Si vous n'utilisez pas le test de rapport, tous les points seront tirés. De cette façon, vous pouvez utiliser ce filtre comme seuil pour ne conserver que les fonctionnalités les mieux adaptées.
Je l'ai implémenté en Python, je ne connais pas très bien Rails. En espérant que ça aide, bonne chance!
Code
import numpy as np
import cv2
# Load images
image1 = cv2.imread('1.jpg', 0)
image2 = cv2.imread('2.jpg', 0)
# Create the sift object
sift = cv2.xfeatures2d.SIFT_create(700)
# Find keypoints and descriptors directly
kp1, des1 = sift.detectAndCompute(image2, None)
kp2, des2 = sift.detectAndCompute(image1, None)
# FLANN parameters
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50) # or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)
# Need to draw only good matches, so create a mask
matchesMask = [[0,0] for i in range(len(matches))]
count = 0
# Ratio test as per Lowe's paper (0.7)
# Modify to change threshold
for i,(m,n) in enumerate(matches):
if m.distance < 0.15*n.distance:
count += 1
matchesMask[i]=[1,0]
# Draw lines
draw_params = dict(matchColor = (0,255,0),
# singlePointColor = (255,0,0),
matchesMask = matchesMask,
flags = 0)
# Display the matches
result = cv2.drawMatchesKnn(image2,kp1,image1,kp2,matches,None,**draw_params)
print('Matches:', count)
cv2.imshow('result', result)
cv2.waitKey()
compare
outil de ligne de commande d'ImageMagick a un-subimage-search
commutateur.