Вы можете взглянуть на сопоставление функций. Идея состоит в том, чтобы найти признаки на двух изображениях и сопоставить их. Этот метод обычно используется для поиска шаблона (скажем, логотипа) в другом изображении. Функция, по сути, может быть описана как то, что людям может показаться интересным в изображении, например, углы или открытые пространства. Существует много типов методов обнаружения признаков, однако я рекомендую использовать масштабно-инвариантное преобразование признаков (SIFT) в качестве алгоритма обнаружения признаков. SIFT инвариантен к перемещению изображения, масштабированию, вращению, частично инвариантен к изменениям освещения и устойчив к локальным геометрическим искажениям. Кажется, это соответствует вашей спецификации, где изображения могут иметь немного разные соотношения.
Учитывая ваши два предоставленных изображения, вот попытка сопоставить функции, используя FLANN средство сопоставления функций. Чтобы определить, являются ли два изображения одинаковыми, мы можем основывать их на некотором заранее определенном пороге, который отслеживает количество совпадений, прошедших тест соотношения, описанный в Отличительные особенности изображения на основе масштабно-инвариантных ключевых точек Дэвид Г. Лоу. Простое объяснение теста состоит в том, что тест отношения проверяет, являются ли совпадения неоднозначными и должны быть удалены, вы можете рассматривать его как метод удаления выбросов. Мы можем подсчитать количество совпадений, прошедших этот тест, чтобы определить, совпадают ли два изображения. Вот результаты сопоставления функций:
![](https://i.stack.imgur.com/Q4UHu.jpg)
![](https://i.stack.imgur.com/R9ngs.jpg)
![](https://i.stack.imgur.com/vIPko.jpg)
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()
person
nathancy
schedule
04.02.2020
compare
имеет-subimage-search
а> переключатель. - person Stefan   schedule 31.01.2020