Potresti dare un'occhiata alla corrispondenza delle caratteristiche. L'idea è di trovare funzionalità in due immagini e abbinarle. Questo metodo viene comunemente utilizzato per trovare un modello (ad esempio un logo) in un'altra immagine. Una caratteristica, in sostanza, può essere descritta come cose che gli umani troverebbero interessanti in un'immagine, come angoli o spazi aperti. Esistono molti tipi di tecniche di rilevamento delle funzionalità, tuttavia la mia raccomandazione è di utilizzare una trasformazione di funzionalità invariante (SIFT) come algoritmo di rilevamento delle funzionalità. SIFT è invariante alla traduzione delle immagini, ridimensionamento, rotazione, parzialmente invariante ai cambiamenti di illuminazione e robusto alla distorsione geometrica locale. Questo sembra corrispondere alle tue specifiche in cui le immagini possono avere rapporti leggermente diversi.
Date le tue due immagini fornite, ecco un tentativo di abbinare le funzionalità utilizzando il Matcher di funzionalità FLANN . Per determinare se le due immagini sono uguali, possiamo basarci su una soglia predeterminata che tiene traccia del numero di corrispondenze che superano il test del rapporto descritto in Caratteristiche distintive dell'immagine da punti chiave invarianti di David G. Lowe . Una semplice spiegazione del test è che il test del rapporto controlla se le corrispondenze sono ambigue e devono essere rimosse, è possibile trattarlo come una tecnica di rimozione anomala. Possiamo contare il numero di corrispondenze che superano questo test per determinare se le due immagini sono uguali. Ecco i risultati della corrispondenza delle funzionalità:
Matches: 42
I punti rappresentano tutte le corrispondenze rilevate mentre le linee verdi rappresentano le "corrispondenze valide" che superano il test del rapporto. Se non si utilizza il test del rapporto, verranno disegnati tutti i punti. In questo modo, è possibile utilizzare questo filtro come soglia per mantenere solo le funzioni più adatte.
L'ho implementato in Python, non ho molta familiarità con Rails. Spero che questo ti aiuti, buona fortuna!
Codice
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
strumento da riga di comando di ImageMagick ha un'opzione-subimage-search
.