機能のマッチングを確認することをお勧めします。アイデアは、2つの画像で特徴を見つけ、それらを一致させることです。この方法は、通常、別の画像でテンプレート(ロゴなど)を見つけるために使用されます。特徴は、本質的に、コーナーやオープンスペースなど、画像で人間が面白いと感じるものとして説明できます。そこには多くの種類の特徴検出手法がありますが、私の推奨は、特徴検出アルゴリズムとしてスケール不変特徴変換(SIFT)を使用することです。SIFTは、画像の変換、スケーリング、回転に対して不変であり、照明の変化に対して部分的に不変であり、局所的な幾何学的歪みに対してロバストです。これは、画像の比率がわずかに異なる可能性がある仕様に一致するようです。
提供された2つの画像を前提として、FLANN機能マッチャーを使用して機能を一致させる試みを次に示します。2つの画像が同じであるかどうかを判断するには、 David G. Loweによる「スケール不変キーポイントからの特徴的な画像機能」で説明されている比率テストに合格した一致数を追跡する所定のしきい値を基にします。テストの簡単な説明は、比率テストでは一致が曖昧であり、削除する必要があるかどうかをチェックするため、外れ値の削除手法として扱うことができます。このテストに合格した一致の数をカウントして、2つの画像が同じかどうかを判断できます。機能の一致結果は次のとおりです。
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
コマンドラインツールには-subimage-search
スイッチがあります。