2

我目前正在嘗試使用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)即可找到有多少「好」匹配存儲在良好中。

這返回了我用來評估輸入圖像與數據庫相似度的匹配數目。不過,我認爲它並不像這樣簡單,因爲當我開始使用鞋子的圖片測試這種圖像時,像香蕉之類的圖像比其他圖像的鞋子獲得更多的「好」匹配。甚至可以比其他顏色的鞋更相似。

我認爲這可能只是一個異常現象,所以我繼續用一個更大的圖像數據集進行測試,發現再次發現鞋子沒有得到分數(或好匹配的數量),就像一個圖像一樣高的四輪摩托車或人,而不是與其他鞋匹配。

所以基本上,我怎樣才能定義兩個圖像使用特徵匹配與數值相似度?

謝謝。

回答

4

我認爲你需要選擇更好的功能,以獲得更好的(或更相似的圖像)結果。 SIFT是一種本地功能,即使圖像的語義不同(如鞋子和香蕉),您也可以找到類似的SIFT功能。

爲了提高相似性的準確性,我建議你決定除了SIFT以外的更好的功能。像圖像中的顏色直方圖一樣。如果使用圖像的顏色直方圖,則會得到顏色直方圖中相似的圖像。爲了找到相似性,您可以使用多種功能組合。您可以通過檢查數據庫中的圖像類型以及您感覺可能是不同語義類之間的明顯特徵來決定這種混合。

如果你可以使用稍微不同的方法,我想建議PLSA,這是我用過的方法。概率潛在語義分析(PLSA)是一種無監督學習算法,它表示低維隱藏類的數據。通過計算新圖像低維表示與所有其他類別的歐式距離,可以找到相似性。您可以根據距離對其進行排序並獲得相似的圖像。即使這裏選擇正確的功能也很重要。你也需要選擇隱藏類的數量。你需要嘗試一些類。

我有一個使用PLSA解決圖像檢索的小型項目。所以如果你不介意這個插件,這裏是PLSA Image retrieval。不幸的是它是Matlab,但你可以理解發生了什麼,並嘗試使用它。我使用顏色直方圖作爲功能。所以選擇能幫助你更好地辨別不同類別的功能。

+0

嘿,謝謝你的迴應!實際上,我已經使用直方圖進行了一些測試,甚至嘗試將直方圖方法與特徵匹配相結合,但是,而不是補充搜索結果,特徵檢測似乎會導致更多的誤報進入查詢結果。我希望得到相反的效果,因爲我的最終計劃是使用多種不同的方法和算法進行搜索並創建各種組合以提供最佳匹配,但是從我用特徵檢測測試的結果來看,似乎有相反的效果。 – Questionnaire

+0

P.S.我試過用BF匹配和FLANN匹配來使用SIFT,SURF和ORB,但是,我仍然收到了相似的結果。 (我正在搜索的圖片索引目前很少,只能搜索大約20到50張圖片。 – Questionnaire

+0

酷!事情是SIFT,SURF/ORB都是本地功能,即使它們捕獲角點等有趣功能他們不會捕獲一個感興趣對象的全局結構,這絕對不是一個簡單的問題,我真的會打賭:1)無監督聚類(像PLSA或甚至是SIFT的kmeans)。這裏使用像HOG這樣的全局特徵是很困難的,因爲樣本量不大,而且對象類不固定。第二個賭注將是2)使用SIFT和顏色直方圖作爲包字模型。祝你一切順利! – harshkn