Es posible que desee echar un vistazo a la coincidencia de características. La idea es encontrar características en dos imágenes y combinarlas. Este método se usa comúnmente para encontrar una plantilla (por ejemplo, un logotipo) en otra imagen. Una característica, en esencia, puede describirse como cosas que los humanos encontrarían interesantes en una imagen, como esquinas o espacios abiertos. Existen muchos tipos de técnicas de detección de características, sin embargo, mi recomendación es utilizar una transformación de características invariantes de escala (SIFT) como algoritmo de detección de características. SIFT es invariante para la traducción de imágenes, escalado, rotación, parcialmente invariable para los cambios de iluminación y robusto para la distorsión geométrica local. Esto parece coincidir con su especificación donde las imágenes pueden tener proporciones ligeramente diferentes.
Dadas sus dos imágenes proporcionadas, aquí hay un intento de hacer coincidir las características utilizando el comparador de características de FLANN . Para determinar si las dos imágenes son iguales, podemos basarlo en un umbral predeterminado que rastrea el número de coincidencias que pasan la prueba de relación descrita en Características de imagen distintivas de puntos clave invariables a escala por David G. Lowe . Una explicación simple de la prueba es que la prueba de proporción verifica si las coincidencias son ambiguas y deben eliminarse, puede tratarse como una técnica de eliminación atípica. Podemos contar el número de coincidencias que pasan esta prueba para determinar si las dos imágenes son iguales. Aquí están los resultados de coincidencia de características:
Matches: 42
Los puntos representan todas las coincidencias detectadas, mientras que las líneas verdes representan las "coincidencias buenas" que pasan la prueba de relación. Si no utiliza la prueba de razón, se dibujarán todos los puntos. De esta manera, puede usar este filtro como umbral para mantener solo las mejores características coincidentes.
Lo implementé en Python, no estoy muy familiarizado con Rails. Espero que esto ayude, buena suerte!
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
herramienta de línea de comandos de ImageMagick tiene un-subimage-search
interruptor.