Google 以圖搜圖的原理,其中的獲取圖片 hash 值的方法就是 AHash。
每張圖片都可以通過某種算法得到一個 hash 值,稱為圖片指紋,兩張指紋相近的圖片可以認為是相似圖片。
以圖搜圖的原理就是獲取你上傳的圖片的指紋,和圖庫的圖片指紋對比,查找出最相似的若干張圖片展示。
除了以圖搜圖,圖片哈希還可以做什么呢?例如圖片檢索,重復圖片剔除,圖片相似度比較等等。
這種哈希算法大概有 4 種:
1,差值哈希:DHash(Difference Hash)
2,均值哈希:AHash(Average Hash)
3,感知哈希:PHash(Perceptual Hash)
4,小波哈希:WHash(Wavelet Hash)
注:常用的是前面三種,DHash、AHash、PHash。其中 PHash 是增強版的 AHash。
圖片基本概念
圖片是由像素點矩陣組成的,信息可保存在數組中,如下圖 4*4 的圖片,可保存在二維數組中:
左上角為起始點
row 表示行,對應圖片的高 height,y 方向
col 表示列,對應圖片的寬 width,x 方向
下面我只講下感知哈希算法的實現:
感知哈希(核心就是:離散余弦變換(DCT))
1,縮小尺寸,建議 32*32 2,灰度化 3,進行離散余弦變換(DCT) 4,取左上角的 8*8 的大小 5,計算平均值 6,比較像素的灰度 7,計算哈希值
PhotoHash 它是python中一個感知哈希算法,用來發現兩個圖像是否相似。
1,安裝包
pip install PhotoHash
2, average_hash
使用平均哈希算法返回圖像的哈希值。該算法將圖像中的每個像素與所有像素的平均值進行比較:
import photohash hash_one = photohash.average_hash('123/dy.jpg') print(hash_one) hash_two = photohash.average_hash('123/6000.jpg') print(hash_two)
結果:
1fffffd48000f0e1
0effff1b10001f02
3,distance
返回給定圖像的average_hash之間的漢明距離
import photohash distance = photohash.distance('123/dy.jpg', '123/6000.jpg') print(distance)
結果:
9
4,is_look_alike
返回一個布爾值,判斷照片是否相似
import photohash similar = photohash.is_look_alike('123/dy.jpg', '123/6000.jpg') print(similar)
結果:
True
import photohash
similar = photohash.is_look_alike('123/dy.jpg', '123/6000.jpg', tolerance=3)//is_look_alike還接受一個可選的寬容參數,該參數定義了比較的嚴格程度。
print(similar)
5,hash_distance
返回相同長度的兩個哈希之間的漢明距離
import photohash hash_one = photohash.average_hash('123/dy.jpg') hash_two = photohash.average_hash('123/6000.jpg') distance = photohash.hash_distance(hash_one, hash_two) print(distance)
結果:
5
6,hashes_are_similar
返回一個布爾值,表示兩個哈希值是否在給定的公差范圍內。與is_look_alike相同,但使用散列而不是圖像路徑
import photohash hash_one = photohash.average_hash('123/dy.jpg') hash_two = photohash.average_hash('123/6000.jpg') similar = photohash.hashes_are_similar(hash_one, hash_two) print(similar)
注:通常漢明距離 小於等於5時我們認為這兩張圖非常相似,大於10 則認為這兩張圖完全不一樣