跳转到主要内容

计算给定图像的差异哈希(感知哈希),用于检测重复项

项目描述

dhash on PyPI (Python Package Index) GitHub Actions Tests

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 (9.0 kB 查看哈希值)

上传时间

构建分布

dhash-1.4-py3-none-any.whl (7.4 kB 查看哈希值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面