imagehash
imagehash是使用Python语言编写的hash计算库,包括如下集中计算方式:
名称 | 简称 | 简介 |
---|---|---|
average hashing (均值散列) | aHash | 对图片的每个像素值进行比较,如果大于等于均值则输出1否则输出0. |
perception hashing (感知散列) | pHash | 它和均值散列有些相似,但它通过频域(frequency domain)做了一个离散余弦变换(Discrete Cosine Transformation). |
gradient hash (梯度散列) | dHash | 计算每个像素的差异,并将差异与平均差异进行比较。 |
wavelet hashing (小波散列) | wHash | 它的工作原理使用频域(frequency domain)类似于pHash,并使用DWT替换了DCT. |
测试图片
使用最为流行的图片
lenna400x400.jpg | lenna512x512.png | lenna317x360_add_text.jpg |
---|---|---|
![]() | ![]() | ![]() |
pHash测试效果:
结果是对分辨率不敏感,但是对图像的内容很敏感。
phash leanna400 : 99c6562d7533a296
phash leanna512 : 99c6562d7533a296
phash leannatext : 98d4946d6e2a72b6
phash leanna400 compare leanna512 : 0.0
phash leanna400 compare leannatext : 0.28125
phash leanna512 compare leannatext : 0.28125
wHash测试效果:
对分辨率不是很敏感,对显示内容更敏感。
whash leanna400 : b698bd8d0b0b8f8c
whash leanna512 : be98bd890b0b8f8c
whash leannatext : 3e7e4d19190b0f1d
whash leanna400 compare leanna512 : 0.03125
whash leanna400 compare leannatext : 0.3125
whash leanna512 compare leannatext : 0.28125
aHash测试效果:
对分辨率不是很敏感,对显示内容更敏感。
average_hash leanna400 : b69cbd890b0b8f8c
average_hash leanna512 : b69c3d890b0b8f8c
average_hash leannatext : 3a7e4c09190b0f1f
average_hash leanna400 compare leanna512 : 0.015625
average_hash leanna400 compare leannatext : 0.3125
average_hash leanna512 compare leannatext : 0.296875
dHash测试效果:
对分辨率不是很敏感,对显示内容更敏感。
dhash leanna400 : 7670795b33131a38
dhash leanna512 : 7670795b33135a38
dhash leannatext : f2f099b93393d9fd
dhash leanna400 compare leanna512 : 0.015625
dhash leanna400 compare leannatext : 0.296875
dhash leanna512 compare leannatext : 0.28125
测试代码:
由于效果不算好,我就不继续测试了。
import PIL
from PIL import Image
import imagehash
lenna400 = PIL.Image.open('./res/lenna400x400.jpg')
lenna512 = PIL.Image.open('./res/lenna512x512.png')
lennaText = PIL.Image.open('./res/lenna317x360_add_text.jpg')
p = imagehash.phash(lenna400)
p1 = imagehash.phash(lenna512)
p2 = imagehash.phash(lennaText)
print('phash leanna400 : ', p)
print('phash leanna512 : ', p1)
print('phash leannatext : ', p2)
print('phash leanna400 compare leanna512 : ', (p - p1) / len(p.hash) ** 2)
print('phash leanna400 compare leannatext : ', (p - p2) / len(p.hash) ** 2)
print('phash leanna512 compare leannatext : ', (p1 - p2) / len(p1.hash) ** 2, end='\n\n')
w = imagehash.whash(lenna400)
w1 = imagehash.whash(lenna512)
w2 = imagehash.whash(lennaText)
print('whash leanna400 : ', w)
print('whash leanna512 : ', w1)
print('whash leannatext : ', w2)
print('whash leanna400 compare leanna512 : ', (w - w1)/len(w.hash)**2)
print('whash leanna400 compare leannatext : ', (w - w2)/len(w.hash)**2)
print('whash leanna512 compare leannatext : ', (w1 - w2)/len(w1.hash)**2, end='\n\n')
a = imagehash.average_hash(lenna400)
a1 = imagehash.average_hash(lenna512)
a2 = imagehash.average_hash(lennaText)
print('average_hash leanna400 : ', a)
print('average_hash leanna512 : ', a1)
print('average_hash leannatext : ', a2)
print('average_hash leanna400 compare leanna512 : ', (a - a1)/len(a.hash)**2)
print('average_hash leanna400 compare leannatext : ', (a - a2)/len(a.hash)**2)
print('average_hash leanna512 compare leannatext : ', (a1 - a2)/len(a1.hash)**2, end='\n\n')
d = imagehash.dhash(lenna400)
d1 = imagehash.dhash(lenna512)
d2 = imagehash.dhash(lennaText)
print('dhash leanna400 : ', d)
print('dhash leanna512 : ', d1)
print('dhash leannatext : ', d2)
print('dhash leanna400 compare leanna512 : ', (d - d1) / len(d.hash) ** 2)
print('dhash leanna400 compare leannatext : ', (d - d2) / len(d.hash) ** 2)
print('dhash leanna512 compare leannatext : ', (d1 - d2) / len(d1.hash) ** 2)