Bạn có thể muốn xem qua tính năng phù hợp. Ý tưởng là tìm các tính năng trong hai hình ảnh và khớp chúng. Phương pháp này thường được sử dụng để tìm một mẫu (giả sử là logo) trong một hình ảnh khác. Một tính năng, về bản chất, có thể được mô tả là những thứ mà con người sẽ thấy thú vị trong một hình ảnh, chẳng hạn như các góc hoặc không gian mở. Có nhiều loại kỹ thuật phát hiện tính năng hiện có tuy nhiên khuyến nghị của tôi là sử dụng biến đổi tính năng bất biến tỷ lệ (SIFT) làm thuật toán phát hiện tính năng. SIFT là bất biến đối với dịch hình ảnh, chia tỷ lệ, xoay, bất biến một phần đối với các thay đổi chiếu sáng và mạnh mẽ đối với biến dạng hình học cục bộ. Điều này dường như phù hợp với đặc điểm kỹ thuật của bạn trong đó các hình ảnh có thể có tỷ lệ hơi khác nhau.
Với hai hình ảnh được cung cấp của bạn, đây là một nỗ lực để khớp các tính năng bằng cách sử dụng trình so khớp tính năng FLANN . Để xác định xem hai hình ảnh có giống nhau hay không, chúng ta có thể căn cứ vào một số ngưỡng được xác định trước để theo dõi số lượng các trận đấu vượt qua bài kiểm tra tỷ lệ được mô tả trong Các tính năng hình ảnh khác biệt từ các Điểm chính không thay đổi tỷ lệ của David G. Lowe . Một lời giải thích đơn giản về kiểm tra là kiểm tra tỷ lệ kiểm tra nếu các kết quả không rõ ràng và cần được loại bỏ, bạn có thể coi đó là một kỹ thuật loại bỏ ngoại lệ. Chúng tôi có thể đếm số lượng trận đấu vượt qua bài kiểm tra này để xác định xem hai hình ảnh có giống nhau không. Đây là kết quả khớp tính năng:
Matches: 42
Các dấu chấm đại diện cho tất cả các kết quả được phát hiện trong khi các đường màu xanh lá cây đại diện cho "kết quả phù hợp" vượt qua bài kiểm tra tỷ lệ. Nếu bạn không sử dụng bài kiểm tra tỷ lệ thì tất cả các điểm sẽ được rút ra. Theo cách này, bạn có thể sử dụng bộ lọc này làm ngưỡng để chỉ giữ các tính năng phù hợp nhất.
Tôi đã triển khai nó trong Python, tôi không rành lắm về Rails. Hy vọng điều này sẽ giúp, chúc may mắn!
Mã
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
công cụ dòng lệnh của ImageMagick có một-subimage-search
công tắc.