2012-04-21 17 views
2

我是新手,我的反對意見是構建一些Web應用程序,該應用程序實現用戶將數據作爲存儲存儲在數據庫中,而我所需要的是以減少存在兩次或更多次存儲的情侶或圖像。因此,我需要的是如何找到已經存儲在數據庫中的重複或類似圖像,或者當用戶試圖在第一步中導入時更好,以及如果他們的圖像與已經存在數據庫中的圖像類似被存儲在數據庫中,系統可以發出警告,不要存儲該圖像。在數據庫上的特定目錄上查找重複或類似圖像

我只是想開發如何在數據庫上的特定目錄上找到一些相似或重複的圖像。你能否給我一些關於如何構建它的解釋,以及我應該學會如何從基本步驟中完成這個任務,比如教程或其他內容。如果可能的話,我想學習很多東西。

在此先感謝,我真的需要這個幫助,謝謝。

+0

按名稱或圖像複製圖像? – 2012-04-21 08:51:19

+0

從圖像,像圖像比較。對不起 – AdityaSetyadi 2012-04-21 08:52:10

+0

你應該檢查這個帖子:http://stackoverflow.com/questions/684713/identifying-2-same-images-using-java – 2012-05-17 15:50:00

回答

1

找到相似圖像的解決方案要複雜得多,所以我會先堅持查找重複圖像。最簡單的做法是採用圖像位的SHA1哈希。這裏是C#中的一些代碼來完成這個(見下文)。至於將散列存儲在數據庫中,我建議您使用binary(20)數據類型來存儲散列的結果。這允許你的SQL服務器進行索引和查詢的速度要比將此散列存儲爲字符串或其他格式要快得多。

private static byte[] GetHashCodeForFile(string file) 
{ 
    int maxNumberOfBytesToUse = 3840000; 

    using (Stream sr = File.OpenRead(file)) 
    { 
     byte[] buffer = (sr.Length > maxNumberOfBytesToUse) ? new byte[maxNumberOfBytesToUse]: new byte[sr.Length]; 

     int bytesToReadIn = (sr.Length < maxNumberOfBytesToUse) ? (int)sr.Length : maxNumberOfBytesToUse; 

     sr.Read(buffer, 0, bytesToReadIn); 
     System.Security.Cryptography.HashAlgorithm hasher = System.Security.Cryptography.SHA1.Create(); 
     byte[] hashCode = hasher.ComputeHash(buffer); 
     return hashCode; 

    } 
} 

搜索相似的圖片是目前正在進行大量的研究的一個難題。它的種類取決於你如何定義類似的。尋找類似的圖像時,一些突出的方法有:創建日期的圖像文件中

  • 檢查元數據(EXIF或類似)標籤,類似的圖像有時可以是彼此相似服用。這可能不是你想要的最好的東西。
  • 計算兩幅圖像的相對歷史圖並將它們在每個顏色通道中的增量進行比較。這具有允許寫入SQL查詢並且對圖像大小不變的優點。使用此方法可以找到已轉換爲縮略圖的圖像。
  • 執行兩幅圖像之間的圖像相減,並查看圖像接近純黑(全爲零)的距離。我不知道使用TSQL查詢來完成此操作的方法,並且此代碼對於需要調整大小的圖像可能會非常棘手。
  • 計算圖像的輪廓(通過Sobel,Canny或其他邊緣檢測器),然後減去兩個圖像以查看其輪廓有多少重疊。再次,我不認爲這可以在SQL中處理。
相關問題