Anda mungkin ingin melihat pencocokan fitur. Idenya adalah menemukan fitur dalam dua gambar dan mencocokkannya. Metode ini biasanya digunakan untuk menemukan templat (misalnya logo) di gambar lain. Fitur, pada dasarnya, dapat digambarkan sebagai hal-hal yang menurut manusia menarik dalam sebuah gambar, seperti sudut atau ruang terbuka. Ada banyak jenis teknik deteksi fitur di luar sana namun rekomendasi saya adalah menggunakan skala-invariant feature transform (SIFT) sebagai algoritma pendeteksian fitur. SIFT tidak berbeda dengan terjemahan gambar, penskalaan, rotasi, sebagian tidak berubah perubahan iluminasi, dan kuat untuk distorsi geometrik lokal. Ini tampaknya sesuai dengan spesifikasi Anda di mana gambar dapat memiliki rasio yang sedikit berbeda.
Dengan dua gambar yang Anda berikan, berikut ini upaya untuk mencocokkan fitur menggunakan pencocokan fitur FLANN . Untuk menentukan apakah kedua gambar itu sama, kita dapat mendasarkannya dari beberapa ambang yang telah ditentukan yang melacak jumlah kecocokan yang lulus uji rasio yang dijelaskan dalam Fitur Gambar Berbeda dari Keypoints Skala-Invarian oleh David G. Lowe . Penjelasan sederhana dari tes ini adalah bahwa tes rasio memeriksa apakah kecocokannya ambigu dan harus dihilangkan, Anda dapat memperlakukannya sebagai teknik penghilangan yang outlier. Kami dapat menghitung jumlah kecocokan yang lulus tes ini untuk menentukan apakah kedua gambar itu sama. Inilah hasil pencocokan fitur:
Matches: 42
Titik-titik mewakili semua kecocokan yang terdeteksi sementara garis hijau mewakili "kecocokan yang baik" yang lulus uji rasio. Jika Anda tidak menggunakan uji rasio maka semua poin akan ditarik. Dengan cara ini, Anda dapat menggunakan filter ini sebagai ambang untuk hanya menyimpan fitur yang paling cocok.
Saya menerapkannya dengan Python, saya tidak terlalu akrab dengan Rails. Semoga ini bisa membantu, semoga berhasil!
Kode
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
alat baris perintah ImageMagick memiliki-subimage-search
saklar.