Ви можете поглянути на відповідність функцій. Ідея полягає у тому, щоб знайти функції у двох зображеннях та співставити їх. Цей метод зазвичай використовується для пошуку шаблону (скажімо логотипу) в іншому зображенні. Особливість, по суті, може бути описана як речі, які людині здадуться цікавими в зображенні, наприклад, куточки або відкриті простори. Існує багато типів методів виявлення особливостей, проте моя рекомендація полягає у використанні масштабного інваріантного перетворення функції (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
комутатор.