2009-06-15 37 views

回答

3

散列通常是將大量數據減少到可用於識別該圖像的短(ish)數的有用方法。

它們有時候只是爲了提供一種方便的方式來識別文件而不需要人的干預,特別是在有幾個並行作者的情況下,不能依靠它來增加某些主計數器(JPG001 JPG002)而沒有重疊。

有時哈希值是不可僞造的,所以我可以說 - 如果您生成的圖像哈希值與我發送圖像時所做的哈希值相同,那麼您可以確定它是來自我的(而不是由妖孽調整)。然而,並非所有的哈希都可以做出這樣的保證,每隔幾年這種流行的這種「加密」哈希就顯示出有致命的缺陷。

+0

所以你會使用它,如果你想分配一個獨特的難以猜測的名稱的形象? – seanbrant 2009-06-15 22:24:46

+1

不,不難猜測,它可以直接從圖像本身導出(大概可以通過你不想猜對的人來訪問)。您可能會首先轉換圖像或爲圖像加水印,這將改變圖像,使散列不再起作用,但我不確定您是否剛剛銷燬了散列值。 – 2009-06-15 22:47:18

-1

嗯....要比較圖像(廣義上,圖片,或任何其他二進制文件)速度快,沒​​有比較整個文件?

+0

那麼,只要你清楚兩幅圖像可能基本相同,或完全相同,甚至僅在元數據上有所不同,那麼是的。 – 2009-06-15 22:14:46

+0

...不同的元數據,但仍然不符合這個「比較」,那麼是的。 – 2009-06-15 22:15:22

1

實際上,圖像哈希算法很流行,可以在一系列幀或視頻中找到相似的圖像,或者像許多電影工作室現在所做的那樣在各種圖像中嵌入水印(幾乎可以讓人毛骨悚然地回到搏擊俱樂部!)。

26

雖然通常散列文件散列文件的各個位的數據,但圖像散列在稍高的層次上工作。不同之處在於,對於圖像散列,如果兩張圖片看起來幾乎完全相同,但格式不同或分辨率不同(或者可能由於壓縮導致輕微損壞),則應該散列到相同的數字。儘管他們的數據的實際部分完全不同,但如果他們看起來與人類完全相同,他們會對同一事物進行哈希處理。

這是搜索的一個應用。 TinEye.com允許您上傳圖片並在互聯網上查找其中的很多事件。像谷歌,它有一個網絡爬蟲,爬過網頁,尋找圖像。然後它將這些圖像散列化並將散列和URL存儲在數據庫中。當你上傳圖片時,它只是簡單地計算哈希值並檢索鏈接到數據庫中該哈希值的所有URL。 TinEye的使用範例包括尋找更高分辨率的圖片,或找到某人的公開facebook/myspace /等。從他們的圖片(假定這些配置文件使用相同的照片輪廓。

圖像散列也可以與高速緩存或本地存儲用於防止重複的照片或存儲的重發,分別。

有很多其他包括圖像驗證和在視頻中查找類似幀的可能性(如其他人所提到的)

19

HashingHashing是一種適用於任意數據並生成固定大小數據(通常爲非常小的數據)的函數。有很多不同類型的哈希,但是如果我們談論圖像哈希,它可以用於:

  • 查找重複的速度非常快。幾乎所有的散列函數都可以工作。不要搜索整個圖像,而是尋找圖像的散列。
  • 找到類似的圖片,我會解釋後

圖片看起來相同的我們,可以是非常不同的,如果你只是比較原始字節。這可能是由於:

  • 調整
  • 旋轉
  • 略有不同的色彩伽瑪
  • 不同格式
  • 一些輕微的噪音,水印和文物

即使你會發現一個圖像只會在一個字節中不同,如果你將一個散列函數應用到它上面,結果可能會非常不同(對於散列,如MD5, SHA它最有可能會完全不同)。

所以你需要一個散列函數,它會爲類似的圖像創建一個類似的(甚至相同的)散列。其中一個通用的是locality sensitive hashing。但是我們知道圖像有什麼樣的問題,所以我們可以想出一個more specialized kind of hash

最公知的算法是:

  • a-hash。平均散列是最簡單的算法,它只使用少量轉換。對圖像進行縮放,轉換爲灰度,計算平均值並根據平均值對灰度進行二值化。現在將二進制圖像轉換爲整數。該算法非常簡單,您可以在一個小時內實現它。
  • p-hash。知覺散列使用類似的方法,但取而代之的是取決於discrete cosine transformation(信號處理中流行的轉換)。
  • d-hash。差異散列使用與散列相同的方法,但不使用有關平均值的信息,而是使用漸變(相鄰像素之間的差異)。
  • w-hash。非常類似於p-hash,但它使用wavelet transformation而不是DCT。

順便說一句,如果你使用Python,所有這些哈希值已經在this library實現。