我目前正在嘗試使用python在openCV中使用SIFT的Brute Force功能匹配器。我試圖將它用於我的服務器上的圖像搜索功能,我在其中輸入圖像並將該圖像與其他圖像進行比較,希望這些匹配能夠指示相似程度。有沒有通過使用特徵匹配來表示相似程度的方法?特徵匹配的圖像相似度測量?
目前,我在玩弄我的 this網站,這也是我將在下面發現後:
img1 = cv2.imread('box.png',0) # queryImage
img2 = cv2.imread('box_in_scene.png',0) # trainImage
# Initiate SIFT detector
sift = cv2.SIFT()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)
# Apply ratio test
good = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good.append([m])
# cv2.drawMatchesKnn expects list of lists as matches.
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2)
plt.imshow(img3),plt.show()
我使用的時刻是什麼打造「相似性」的措施是應用比率測試獲得的「良好」匹配的數量,只需使用簡單的len(good)
即可找到有多少「好」匹配存儲在良好中。
這返回了我用來評估輸入圖像與數據庫相似度的匹配數目。不過,我認爲它並不像這樣簡單,因爲當我開始使用鞋子的圖片測試這種圖像時,像香蕉之類的圖像比其他圖像的鞋子獲得更多的「好」匹配。甚至可以比其他顏色的鞋更相似。
我認爲這可能只是一個異常現象,所以我繼續用一個更大的圖像數據集進行測試,發現再次發現鞋子沒有得到分數(或好匹配的數量),就像一個圖像一樣高的四輪摩托車或人,而不是與其他鞋匹配。
所以基本上,我怎樣才能定義兩個圖像使用特徵匹配與數值相似度?
謝謝。
嘿,謝謝你的迴應!實際上,我已經使用直方圖進行了一些測試,甚至嘗試將直方圖方法與特徵匹配相結合,但是,而不是補充搜索結果,特徵檢測似乎會導致更多的誤報進入查詢結果。我希望得到相反的效果,因爲我的最終計劃是使用多種不同的方法和算法進行搜索並創建各種組合以提供最佳匹配,但是從我用特徵檢測測試的結果來看,似乎有相反的效果。 – Questionnaire
P.S.我試過用BF匹配和FLANN匹配來使用SIFT,SURF和ORB,但是,我仍然收到了相似的結果。 (我正在搜索的圖片索引目前很少,只能搜索大約20到50張圖片。 – Questionnaire
酷!事情是SIFT,SURF/ORB都是本地功能,即使它們捕獲角點等有趣功能他們不會捕獲一個感興趣對象的全局結構,這絕對不是一個簡單的問題,我真的會打賭:1)無監督聚類(像PLSA或甚至是SIFT的kmeans)。這裏使用像HOG這樣的全局特徵是很困難的,因爲樣本量不大,而且對象類不固定。第二個賭注將是2)使用SIFT和顏色直方圖作爲包字模型。祝你一切順利! – harshkn