aodto / phasher
图像处理库,用于比较图像
Requires
- php: >=5.3.0
This package is not auto-updated.
Last update: 2024-09-24 16:14:42 UTC
README
感知哈希是一种生成图像哈希的方法,它允许通过相似度索引比较多个图像。您可以在The Hacker Factor和phash.org了解更多信息。
我已经将这个基本方法扩展成一个类,它可以比较已经旋转或翻转(但仅限于90度增量)的图像。它还可以匹配经过颜色校正(在一定程度上)或更改的图像。然而,这种灵活性会导致误报,并且它的速度非常慢——目前生成哈希和比较图像需要大约一秒钟——在生产环境中,您可能需要为现有图像生成哈希缓存,然后比较图像的哈希值。
PHasher采用MIT许可。
###使用方法###
include_once('phasher.class.php');
$I = PHasher::Instance();
是的,它是一个单例。
$I->HashImage($res, $rot=0, $mir=0, $size=8);
从图像中生成感知哈希。
- $res 是图像文件名。
- $rot 创建哈希值时,假设图像已旋转此值。默认值为0,允许的值为90、180、270。
- $mir 创建哈希值,就像图像被镜像和/或翻转一样。默认值为0,1为镜像,2为翻转,3为镜像和翻转。
这目前仍然有bug。
- $size 从原始图像创建的缩略图大小 - 哈希值将是这个值的平方(因此值为8将构建一个8x8图像的哈希值,64位。)
这返回一个表示感知哈希的二进制值数组。这样做是为了使处理更容易。
$I->Compare($res1, $res2, $rot=0, $precision=1);
从两个图像中构建感知哈希,比较它们并返回它们之间的相似度百分比。
- $res1 是图像文件名。
- $res2 是另一个图像文件名。
- $rot 创建哈希值时,假设第二个图像已旋转此值。默认值为0,允许的值为90、180、270。
- $precision 返回这么多小数位数。默认值为1。
$I->Detect($res1, $res2, $precision=1);
通过所有旋转比较两个图像,并返回最高的匹配值。
$I->FastHashImage($res, $size=8);
没有旋转的更快的哈希方法。返回与HashImage相同的数组。
$I->HashAsString($hash, $hex=true);
将一个由HashImage方法返回的哈希数组转换为十六进制字符串(如果$hex == true)或二进制字符串(如果$hex==false)。
$I->HashAsTable($hash, $size=8, $cellsize=10);
将哈希数组转换为HTML表格,每个单元格的值是白色或黑色。这仅用于演示和调试,应避免使用,因为它基本上是无用的且速度慢。
示例用法
找到'images1.jpg'和'image2.jpg'之间的相似度百分比。在90度角处进行比较。
$I = PHasher::Instance();
$file1 = 'image1.jpg';
$file2 = 'image2.jpg';
$result = $I->Compare($file1, $file2);
$result90 = $I->Compare($file1, $file2, 90);
$result180 = $I->Compare($file1, $file2, 180);
$result270 = $I->Compare($file1, $file2, 270);
$max_match = max($result, $result90, $result180, $result270);
上面的与以下相同
$I = PHasher::Instance();
$file1 = 'image1.jpg';
$file2 = 'image2.jpg';
$result = $I->Detect($file1, $file2);
注意
Redaktor项目的Sebastian Lasse构建了一个phasher的javascript实现,使用了dojo库,这相当酷。
我仍在尝试加速算法并改进散列功能,因为它有时会产生误报(它最初是用来捕捉论坛和图像板上图像垃圾邮件的,所以它尽可能激进。)如果有人想通过添加离散余弦变换来改进它,请随意发起pull request,因为我还不知道如何实现。