计算给定图像的差异哈希(感知哈希),用于检测重复项
项目描述
dhash是一个Python库,它为给定图像生成一个“差异哈希” —— 一个基于Neal Krawetz的dHash算法的感知哈希,该算法在这篇“Hacker Factor”博客文章中有所介绍。
该库位于Python包索引(PyPI)上,适用于Python 3和Python 2.7。要安装它,打开命令提示符,如果您正在使用虚拟环境,请激活它,然后输入
pip install dhash
创建差异哈希的算法非常简单
将图像转换为灰度图
将其缩小到9x9缩略图(大小=8表示一个8+1x8+1的图像)
生成一个64位的“行哈希”:1位表示像素强度在x方向上增加,0表示减少
同样地,在y方向上生成一个64位的“列哈希”
将这两个值组合起来生成最终的128位哈希值
库默认生成大小为8的dhash,但您可以通过将size=N作为关键字参数传递给大多数函数来轻松覆盖此设置。例如,您可以指定size=16来生成一个更准确(但使用起来较慢)的512位dhash。
我发现dhash非常适合检测近似重复项(我们使用8位dhash和最大2位差的值找到了重复项)。但由于算法的简单性,它不太擅长找到相似图像或裁剪过的重复图像——如果您想做到这一点,就需要更复杂的图像指纹。然而,dhash非常适合找到精确重复项和近似重复项,例如,略有改变的照明、轻微裁剪或非常轻微的PS处理后的同一图像。
要使用dhash库,您需要安装wand ImageMagick绑定或Pillow (PIL)库。选择一个并坚持使用——由于它们在灰度转换和缩放算法上的差异,它们将产生略微不同的dhash值。
如果您已安装这两个库,dhash将默认使用wand。要在使用库之前覆盖此行为并强制使用Pillow/PIL,请调用dhash.force_pil()。
使用wand生成dhash值
import dhash
from wand.image import Image
with Image(filename='dhash-test.jpg') as image:
row, col = dhash.dhash_row_col(image)
print(dhash.format_hex(row, col))
使用Pillow生成dhash值
import dhash
from PIL import Image
image = Image.open('dhash-test.jpg')
row, col = dhash.dhash_row_col(image)
print(dhash.format_hex(row, col))
如果您有自己的库,可以将图像转换为灰度并将尺寸缩小到9x9(或对于size=16,为17x17),您可以向dhash_row_col()传递一个整数像素强度列表(例如,从0到255)。例如
>>> import dhash
>>> row, col = dhash.dhash_row_col([0,0,1,1,1, 0,1,1,3,4, 0,1,6,6,7, 7,7,7,7,9, 8,7,7,8,9], size=4)
>>> format(row, '016b')
'0100101111010001'
>>> format(col, '016b')
'0101001111111001'
要直接生成128位整数的哈希值,使用dhash_int(image, size=N)。要按各种方式格式化哈希值,请使用format_*函数
>>> row, col = (13962536140006260880, 9510476289765573406)
>>> dhash.format_bytes(row, col)
b'\xc1\xc4\xe4\xa4\x84\xa0\x80\x90\x83\xfb\xff\xcc\x00@\x83\x1e'
>>> dhash.format_hex(row, col)
'c1c4e4a484a0809083fbffcc0040831e'
要计算两个哈希值之间不同的位数(汉明距离),您可以使用辅助函数get_num_bits_different(hash1, hash2)
>>> import dhash
>>> dhash.get_num_bits_different(0x4bd1, 0x5bd2)
3
您还可以使用dhash从命令行生成特定图像的差异哈希
$ python -m dhash dhash-test.jpg c1c4e4a484a0809083fbffcc0040831e $ python -m dhash --format=decimal dhash-test.jpg 13962536140006260880 9510476289765573406 # show the 8x8 row and column grids $ python -m dhash --format=matrix dhash-test.jpg * * . . . . . * * * . . . * . . * * * . . * . . * . * . . * . . * . . . . * . . * . * . . . . . * . . . . . . . * . . * . . . . * . . . . . * * * * * * * . * * * * * * * * * * * * . . * * . . . . . . . . . . . * . . . . . . * . . . . . * * . . . * * * * . # compute the bit delta between two images $ python -m dhash dhash-test.jpg similar.jpg 1 bit differs out of 128 (0.8%)
有关更多详细信息,请阅读dhash.py中的代码——它非常小!
dhash由Ben Hoyt编写,并使用许可的MIT许可证(请参阅LICENSE.txt)。
项目详情
下载文件
为您的平台下载文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分布
构建分布
dhash-1.4.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e0fd71c86d93585b7f08af7baceb0106cf1016ca70223517003605855b485183 |
|
MD5 | 841c75e51278f6922ab1dc3ab0a6a426 |
|
BLAKE2b-256 | 451b68986e7d0e1fff5e154d96bf5c420f9933571f1d13f788b3d1b05f978267 |
dhash-1.4-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 759e1f7bdc99c3fb271ab5672a0f843ae274a7ea6794423618797cc12c680296 |
|
MD5 | 56bba352664415fef9941d22d5a04f3d |
|
BLAKE2b-256 | 5a15ab8b7105573b2f8730ec22a9cdd9014d6aebd36fb8a4f0412123090d6eb1 |