Você pode dar uma olhada na correspondência de recursos. A idéia é encontrar recursos em duas imagens e combiná-los. Esse método é comumente usado para encontrar um modelo (por exemplo, um logotipo) em outra imagem. Um recurso, em essência, pode ser descrito como coisas que os humanos considerariam interessantes em uma imagem, como cantos ou espaços abertos. Existem muitos tipos de técnicas de detecção de recursos por aí, no entanto, minha recomendação é usar uma transformação de recurso invariável em escala (SIFT) como um algoritmo de detecção de recursos. O SIFT é invariável à conversão, redimensionamento, rotação da imagem, parcialmente invariável às mudanças de iluminação e robusto à distorção geométrica local. Isso parece corresponder à sua especificação, onde as imagens podem ter proporções ligeiramente diferentes.
Dadas as duas imagens fornecidas, aqui está uma tentativa de combinar os recursos usando o combinador de recursos da FLANN . Para determinar se as duas imagens são iguais, podemos basear algum limiar predeterminado que rastreia o número de correspondências que passam no teste de proporção descrito em Recursos de imagem distintiva de pontos-chave invariantes em escala por David G. Lowe . Uma explicação simples do teste é que o teste de proporção verifica se as correspondências são ambíguas e devem ser removidas; você pode tratá-lo como uma técnica de remoção externa. Podemos contar o número de correspondências que passam neste teste para determinar se as duas imagens são iguais. Aqui estão os resultados da correspondência de recursos:
Matches: 42
Os pontos representam todas as correspondências detectadas, enquanto as linhas verdes representam as "boas correspondências" que passam no teste de proporção. Se você não usar o teste de proporção, todos os pontos serão sorteados. Dessa forma, você pode usar esse filtro como limite para manter apenas os melhores recursos correspondentes.
Eu o implementei em Python, não estou muito familiarizado com o Rails. Espero que isso ajude, boa sorte!
Código
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
ferramenta de linha de comando do ImageMagick possui uma-subimage-search
opção.