sapientpro / image-comparator
使用PHP比较图像
Requires
- php: ^8.1
- ext-gd: *
- brick/math: ^0.12.1
Requires (Dev)
- phpunit/phpunit: ^10.0.0|^11.0.0
- squizlabs/php_codesniffer: ^3.7.2
This package is not auto-updated.
Last update: 2024-09-20 11:36:45 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 页面 上了解有关可用方法的更多信息