piksera / image-comparator
使用 PHP 比较图像,查看 sapientpro/image-comparator
Requires
- php: ^8.1
- ext-gd: *
This package is auto-updated.
Last update: 2024-09-07 08:43:17 UTC
README
Image Comparator 是一个用于图像比较和散列的 PHP 库。您可以使用感知哈希方法比较 2 张或更多图像。
基于 https://github.com/kennethrapp/phasher 包,支持 PHP 8 和 PHPUnit。原始项目于 2017 年 11 月被遗弃。
感知哈希是一种生成图像哈希的方法,它允许通过相似性索引比较多个图像。您可以在 The Hacker Factor 和 phash.org 上找到更多信息。
安装
先决条件
- PHP 8.1 或更高版本
- gd 扩展已启用
要安装库,请运行
composer require sapientpro/image-comparator
使用方法
ImageComparator
是库的核心类
use SapientPro\ImageComparator\ImageComparator; $imageComparator = new ImageComparator()
创建实例后,您可以使用以下方法之一
$imageComparator->compare('your-images/your-image1.jpg', 'your-images/your-image12.jpg');
如果图像路径无法解析,将抛出 ImageResourceException
$imageComparator->hashImage('your-images/non-existent-image.jpg'); // SapientPro\ImageComparator\ImageResourceException: Could not create an image resource from file
示例用法
我们有两张图像
https://github.com/sapientpro/image-comparator/blob/master/tests/images/ebay-image.png?raw=true
现在,让我们比较它们
use SapientPro\ImageComparator\ImageComparator; $image1 = 'https://github.com/sapientpro/image-comparator/blob/feature/phasher-implementation/tests/images/ebay-image.png?raw=true'; $image2 = 'https://github.com/sapientpro/image-comparator/blob/feature/phasher-implementation/tests/images/amazon-image.png?raw=true' $imageComparator = new ImageComparator(); $similarity = $imageComparator->compare($image1, $image2); //default hashing without rotation echo $similarity; //87.5
结果越高,图像的相似度越高。
让我们比较不同的图像
use SapientPro\ImageComparator\ImageComparator; $image1 = 'https://github.com/sapientpro/image-comparator/blob/feature/phasher-implementation/tests/images/ebay-image2.png?raw=true'; $image2 = 'https://github.com/sapientpro/image-comparator/blob/feature/phasher-implementation/tests/images/amazon-image2.png?raw=true' $imageComparator = new ImageComparator(); $similarity = $imageComparator->compare($image1, $image2); //default hashing without rotation echo $similarity; //54.7
如果比较的图像已旋转,可以传递旋转角度。您必须传递 \SapientPro\ImageComparator\Enum\ImageRotationAngle 枚举中的一个以下值:D0
= 0 度,D90
= 90 度,D180
= 180 度,D270
= 270 度
use SapientPro\ImageComparator\Enum\ImageRotationAngle; $similarity = $imageComparator->compare($image1, $image2, ImageRotationAngle::D180); //compared image will be considered rotated by 180 degrees echo $similarity; //95.3
您还可以使用 detect()
方法,该方法将旋转比较图像并返回最高的相似度百分比
use SapientPro\ImageComparator\ImageComparator; $image1 = 'https://raw.githubusercontent.com/sapientpro/phasher/feature/phasher-implementation/tests/images/forest1.jpg'; $image2 = 'https://raw.githubusercontent.com/sapientpro/phasher/feature/phasher-implementation/tests/images/forest1-copyrighted.jpg' $imageComparator = new ImageComparator(); $similarity = $imageComparator->detect($image1, $image2); echo $similarity; //95.3
使用 compareArray()
和 detectArray()
方法,您可以将源图像与任何数量的图像进行比较。行为与 compare()
和 detect()
方法相同。
use SapientPro\ImageComparator\ImageComparator; $image1 = 'https://raw.githubusercontent.com/sapientpro/phasher/feature/phasher-implementation/tests/images/forest1.jpg'; $image2 = 'https://raw.githubusercontent.com/sapientpro/phasher/feature/phasher-implementation/tests/images/forest1-copyrighted.jpg' $image3 = 'https://raw.githubusercontent.com/sapientpro/phasher/feature/phasher-implementation/tests/images/forest.jpg' $imageComparator = new ImageComparator(); $similarity = $imageComparator->compareArray( $image1, [ 'forest' => $image2, 'anotherForest' => $image3 ] ); // returns ['forest' => 95.33, 'anotherForest' => 75.22]
如果需要,您可以从其他图像创建一个方形图像资源,并将其传递给 compare()
、compareArray()
、detect()
、detectArray
和 hashImage()
方法
use SapientPro\ImageComparator\ImageComparator; $image1 = 'https://raw.githubusercontent.com/sapientpro/phasher/feature/phasher-implementation/tests/images/forest1.jpg'; $image2 = 'https://raw.githubusercontent.com/sapientpro/phasher/feature/phasher-implementation/tests/images/forest1-copyrighted.jpg' $imageComparator = new ImageComparator(); $squareImage1 = $imageComparator->squareImage($image1); $squareImage2 = $imageComparator->squareImage($image2); $similarity = $imageComparator->compare($squareImage1, $squareImage2); echo $similarity //96.43;
如果需要,您可以将 hashImage()
返回的结果数组转换为二进制字符串,并将其传递给 compareHashStrings()
方法
use SapientPro\ImageComparator\ImageComparator; $image1 = 'https://raw.githubusercontent.com/sapientpro/phasher/feature/phasher-implementation/tests/images/forest1.jpg'; $image2 = 'https://raw.githubusercontent.com/sapientpro/phasher/feature/phasher-implementation/tests/images/forest1-copyrighted.jpg' $imageComparator = new ImageComparator(); $hash1 = $imageComparator->hashImage($image1); $hash2 = $imageComparator->hashImage($image2); $hashString1 = $imageComparator->convertHashToBinaryString($hash1); $hashString2 = $imageComparator->convertHashToBinaryString($hash2); $similarity = $imageComparator->compareHashStrings($hashString1, $hashString2); echo $similarity //96.43;
默认情况下,图像使用平均哈希算法进行哈希,该算法在 SapientPro\ImageComparator\Strategy\AverageHashStrategy
中实现。此策略在 ImageComparator
的构造函数中初始化。
还可以使用差异哈希算法,它在 SapientPro\ImageComparator\Strategy\DifferenceHashStrategy
中实现。要使用它,您需要调用 ImageComparator 的 setHashStrategy()
方法并传递策略的实例
use SapientPro\ImageComparator\Strategy\DifferenceHashStrategy; $imageComparator->setHashStrategy(new DifferenceHashStrategy()); $imageComparator->hashImage('image1.jpg');
如果通过 setHashingStrategy()
设置了策略,则将在其他比较方法中在后台使用它
use SapientPro\ImageComparator\Strategy\DifferenceHashStrategy; $imageComparator->setHashStrategy(new DifferenceHashStrategy()); $imageComparator->compare('image1.jpg', 'image2.jpg'); // images will be hashed using difference hash algorithm and then compared
可用方法
您可以在我们的 wiki 页面 上了解可用的方法