2008-12-03 86 views
38

有時兩個圖像文件在文件級別上可能會有所不同,但是人類會認爲它們在感知上完全相同。鑑於此,現在假設你有一個巨大的圖像數據庫,並且你想知道一個人是否會認爲圖像X存在於數據庫中。如果所有圖像都具有敏感的散列/指紋,則可以散列圖像X,並且查看它是否在數據庫中是很簡單的事情。檢測兩個圖像在視覺上是否相同

我知道有研究解決這個問題,一些算法存在的,但沒有任何工具,像UNIX命令行工具,或者我可以用它來計算這樣的散列沒有從頭開始實現一些算法庫?

編輯:從findimagedupes相關代碼,使用ImageMagick

try $image->Sample("160x160!"); 
try $image->Modulate(saturation=>-100); 
try $image->Blur(radius=>3,sigma=>99); 
try $image->Normalize(); 
try $image->Equalize(); 
try $image->Sample("16x16"); 
try $image->Threshold(); 
try $image->Set(magick=>'mono'); 
($blob) = $image->ImageToBlob(); 

編輯:警告! ImageMagick $ image對象似乎包含有關讀入的圖像文件的創建時間的信息。這意味着即使對於同一圖像,如果在不同的時間檢索到的圖像塊也會有所不同。爲確保指紋保持不變,請使用$ image-> getImageSignature()作爲最後一步。

+1

這過程聽起來非常處理器密集型。 – endolith 2009-08-15 18:28:02

+0

*這意味着如果在不同的時間檢索到相同的圖像,你得到的blob會有所不同。*對於`「$ blob」`字符串(如果放在雙引號中),這是不正確的,如果圖像像素相同,則將完全相同的32個字節。 – pts 2016-12-01 16:46:55

回答

14

findimagedupes是相當不錯的。例如,您可以運行「findimagedupes -v指紋圖像」,讓它打印「感知性散列」。

+0

確實是在Python中實現相同的算法(GraphicsMagick工具做繁重的)位置:https://github.com/pts/pyfindimagedupes – pts 2016-12-01 16:48:39

-2

你可以使用diff,看看他們是否真的是不同的。我猜它會刪除大量無用的比較。然後,對於算法,我將使用概率方法..他們看起來相同的機會有多大?我基於每個像素的rgb數量。你還可以找到其他一些指標,如光度和類似的東西。

1

我不知道它背後的算法,但Microsoft Live Image Search只是added這種能力。 Picasa還能夠識別圖像中的人臉,並對看​​起來相似的人臉進行分組。大多數時候,這是同一個人。

一些機器學習技術,如支持向量機,神經網絡,樸素貝葉斯分類器或貝葉斯網絡將是最好的,在這種類型的問題。我寫了前三個中的每一個來對手寫數字進行分類,這本質上是圖像模式識別。

0

將圖像大小調整爲1x1像素...如果它們確切,則存在小概率它們是相同圖像... 現在將其大小調整爲2x2像素圖像,如果所有4個像素都精確,那麼是一個更大的概率,他們是確切的... 然後3x3,如果所有9像素是確切的...好機會等 然後4x4,如果所有16像素是確切的,...更好的機會。

等等

做這種方式,可以使效率改進措施......如果1x1像素網格是關閉了很多,爲什麼還要檢查2x2的網格?等等

+0

這不會在一個圖像已略作調整的情況下工作,所以它是輕微更暗或更飽和,或已被少量裁剪。您還必須考慮到重採樣是一件代價昂貴的事情,尤其是在大圖像上使用雙三次插值時。 – 2009-01-01 08:27:35

-2

DPEG「The」Duplicate Media Manager,但其代碼未打開。這是一個非常老的工具 - 我記得在2003年使用它。

0

如果您有很多圖像,可以使用顏色直方圖來獲得圖像的粗略貼圖,然後再對每幅圖像進行完整圖像比較即O(n^2))。

4

顏色直方圖好已調整大小相同的圖像,重新取樣等
如果你想匹配同一地標的不同人物的照片,這很麻煩 - 請看哈爾分類器。 Opencv是一個很好的圖像處理免費庫。

5

互相關或相關聯會告訴你,如果圖像是相同的,即使有噪音,降解和水平或垂直偏移。使用基於FFT的方法會比問題中描述的算法快得多。

通常的算法不爲是不一樣的規模或旋轉圖像工作,雖然。您可以預先旋轉或預縮放它們,但這確實是處理器密集型的。顯然你也可以在對數極座標空間中進行關聯,它對於旋轉,平移和縮放是不變的,但我不清楚細節足以解釋這一點。

MATLAB例如:Registering an Image Using Normalized Cross-Correlation

維基百科稱此爲「phase correlation」並且還描述making it scale- and rotation-invariant

的方法可以擴展由第一轉換圖像,以記錄到確定旋轉和兩個圖像之間的縮放差異-極座標。由於傅立葉變換的特性,旋轉和縮放參數可以以對平移不變的方式確定。

相關問題