jenssegers/imagehash

PHP 的感知图像哈希

资助包维护!
jenssegers
Tidelift

安装次数: 1,502,130

依赖项: 6

建议者: 0

安全: 0

星标: 1,984

关注者: 68

分支: 175

开放问题: 37

v0.10.0 2024-06-17 09:53 UTC

This package is auto-updated.

Last update: 2024-09-17 11:14:29 UTC


README

Latest Stable Version Build Status Coverage Status Donate

感知哈希是从多媒体文件内容中提取的各种特征生成的指纹。与依赖于输入微小变化导致输出发生剧烈变化的加密哈希函数不同,如果特征相似,感知哈希则彼此“接近”。

感知哈希与MD5和SHA1等加密哈希函数是不同的概念。在加密哈希中,哈希值是随机的。用于生成哈希的数据就像一个随机种子,因此相同的数据将生成相同的结果,而不同的数据将创建不同的结果。比较两个SHA1哈希值实际上只告诉你两件事。如果哈希值不同,则数据不同。如果哈希值相同,则数据可能相同。相比之下,感知哈希可以进行比较——给你两个数据集相似性的感觉。

此代码受到以下内容的启发/基于

要求

  • PHP 8.1 或更高版本
  • gdimagick 扩展
  • 可选,安装 GMP 扩展以实现更快的指纹比较

安装

此包尚未达到稳定版本,0.x 版本之间可能存在向后兼容性问题。如果您打算在生产中使用此包,请确保锁定版本!

使用 composer 安装

composer require jenssegers/imagehash

用法

此库包含 4 种内置哈希实现

  • Jenssegers\ImageHash\Implementations\AverageHash - 基于平均图像颜色的哈希
  • Jenssegers\ImageHash\Implementations\DifferenceHash - 基于前一个像素的哈希
  • Jenssegers\ImageHash\Implementations\BlockHash - 基于blockhash.io 的哈希 仍在开发中
  • Jenssegers\ImageHash\Implementations\PerceptualHash - 原始 pHash 仍在开发中

选择这些实现之一。如果您不知道使用哪一个,请尝试使用 DifferenceHash 实现。一些实现允许一些配置,请确保检查构造函数。

use Jenssegers\ImageHash\ImageHash;
use Jenssegers\ImageHash\Implementations\DifferenceHash;

$hasher = new ImageHash(new DifferenceHash());
$hash = $hasher->hash('path/to/image.jpg');

echo $hash;
// or
echo $hash->toHex();

生成的 Hash 对象是一个十六进制图像指纹,一旦计算出来就可以存储在您的数据库中。汉明距离用于比较两个图像指纹的相似性。低距离值表示图像相似或相同,高距离值表示图像不同。使用以下方法检测图像是否相似:

$distance = $hasher->distance($hash1, $hash2);
// or
$distance = $hash1->distance($hash2);

相同的图像不一定总是具有0的距离,因此您需要决定在哪个距离上评估图像为相等。对于我测试的图像集,最大距离为5是可以接受的。但这将取决于实现方式、图像以及图像数量。例如;当比较小量图像时,较低的最大距离应该是可以接受的,因为误报的可能性相当低。然而,如果您正在比较大量图像,5可能已经太多。

Hash对象可以以几种不同的格式返回内部二进制哈希。

echo $hash->toHex(); // 7878787c7c707c3c
echo $hash->toBits(); // 0111100001111000011110000111110001111100011100000111110000111100
echo $hash->toInt(); // 8680820757815655484
echo $hash->toBytes(); // "\x0F\x07ƒƒ\x03\x0F\x07\x00"

选择您在数据库中存储哈希的偏好。如果您想从之前计算出的值中重建一个Hash对象,请使用

$hash = Hash::fromHex('7878787c7c707c3c');
$hash = Hash::fromBin('0111100001111000011110000111110001111100011100000111110000111100');
$hash = Hash::fromInt('8680820757815655484');

演示

这些图像很相似

Equals1 Equals2

Image 1 hash: 3c3e0e1a3a1e1e1e (0011110000111110000011100001101000111010000111100001111000011110)
Image 2 hash: 3c3e0e3e3e1e1e1e (0011110000111110000011100011111000111110000111100001111000011110)
Hamming distance: 3

这些图像不同

Equals1 Equals2

Image 1 hash: 69684858535b7575 (0010100010101000101010001010100010101011001010110101011100110111)
Image 2 hash: e1e1e2a7bbaf6faf (0111000011110000111100101101001101011011011101010011010101001111)
Hamming distance: 32

安全联系方式

要报告安全漏洞,请遵循这些步骤