介紹
每張圖片都有一個唯一性的指紋。就好像人類的指紋可以識別出這個人類似。
圖片指紋是什么?(圖片哈希)
- 用圖片指紋進行相似圖片的檢測。這種技術通常被稱為“感知圖像hash”或是簡單的“圖片hash”。
- 圖片hash是檢測一張圖片的內容然后根據檢測的內容為圖片建立一個唯一值的過程。
- 比如,給定一張圖片作為輸入,應用一個hash函數,然后基於圖片的視覺計算出一個圖片hash。相似的圖片也應當有相似的hash值。
- 將會使用“差別Hash”或簡單的DHash算法計算圖片指紋。簡單來說,DHash算法着眼於兩個相鄰像素之間的差值。然后,基於這樣的差值,就建立起一個hash值了。
為什么不使用md5,sha-1等算法?
我們不能在實現中使用加密hash算法。由於加密hash算法的本質使然,輸入文件中非常微小的差別也能造成差異極大的hash值。我們實際上希望相似的輸入可以有相似的hash輸出值。
安裝相關庫
pip install Pillow
pip install ImageHash
pip install numpy
pip install scipy
開始使用
獲取圖片指紋
from PIL import Image
import imagehash
# 給一張圖片
img1 = Image.open('images/demo4.jpg')
res = imagehash.dhash(img1) # 4f999cc90979704c
計算漢明距離
漢明距離被用於計算一個哈希中的不同位數。因此,哈希中只有一位不同的兩張圖片自然比有10位不同的圖片更相似。
全部代碼
from PIL import Image
import imagehash
def img(img_path):
"""
圖片哈希(類似:4f999cc90979704c)
:param img_path: 圖片路徑
:return: <class 'imagehash.ImageHash'>
"""
img1 = Image.open(img_path)
res = imagehash.dhash(img1)
return res
def hamm_img(res1, res2):
"""
漢明距離,漢明距離越小說明越相似,等 0 說明是同一張圖片,大於10越上,說明完全不相似
:param res1:
:param res2:
:return:
"""
str1 = str(res1) # <class 'imagehash.ImageHash'> 轉成 str
str2 = str(res2)
num = 0 # 用來計算漢明距離
for i in range(len(str1)):
if str1[i] != str2[i]:
num += 1
return num
if __name__ == '__main__':
img_path1 = 'images/demo1.jpg'
img_path2 = 'images/demo2.jpg'
res = hamm_img(img(img_path1), img(img_path2))
print('漢明距離是:', res)