Вы можете взглянуть на соответствие функций. Идея состоит в том, чтобы найти функции на двух изображениях и сопоставить их. Этот метод обычно используется для поиска шаблона (скажем, логотипа) в другом изображении. По сути, особенность может быть описана как вещи, которые люди могут найти интересными на изображении, такие как углы или открытые пространства. Существует много типов методов обнаружения признаков, однако я рекомендую использовать масштабно-инвариантное преобразование признаков (SIFT) в качестве алгоритма обнаружения признаков. SIFT инвариантен к трансляции изображения, масштабированию, вращению, частично инвариантен к изменениям освещения и устойчив к локальным геометрическим искажениям. Похоже, это соответствует вашей спецификации, где изображения могут иметь немного разные отношения.
Учитывая ваши два предоставленных изображения, вот попытка сопоставить функции, используя функцию соответствия FLANN . Чтобы определить, совпадают ли эти два изображения, мы можем основать его на некотором заранее определенном пороговом значении, которое отслеживает число совпадений, которые проходят тест на соотношение, описанный в « Отличительных особенностях изображения от масштабно-инвариантных ключевых точек» Дэвида Дж. Лоу . Простое объяснение теста состоит в том, что тест отношения проверяет, являются ли совпадения неоднозначными и должны быть удалены, вы можете рассматривать это как метод удаления выбросов. Мы можем подсчитать количество совпадений, прошедших этот тест, чтобы определить, совпадают ли два изображения. Вот результаты соответствия функции:
Matches: 42
Точки представляют все обнаруженные совпадения, в то время как зеленые линии представляют «хорошие совпадения», которые проходят тест на соотношение. Если вы не используете тест отношения, то все точки будут нарисованы. Таким образом, вы можете использовать этот фильтр в качестве порога, чтобы сохранить только наиболее подходящие функции.
Я реализовал это на Python, я не очень знаком с Rails. Надеюсь это поможет. Удачи!
Код
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
инструмент командной строки ImageMagick имеет-subimage-search
переключатель.