找到相似圖像的解決方案要複雜得多,所以我會先堅持查找重複圖像。最簡單的做法是採用圖像位的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中處理。
按名稱或圖像複製圖像? – 2012-04-21 08:51:19
從圖像,像圖像比較。對不起 – AdityaSetyadi 2012-04-21 08:52:10
你應該檢查這個帖子:http://stackoverflow.com/questions/684713/identifying-2-same-images-using-java – 2012-05-17 15:50:00