microweber-deps / image-comparator
使用PHP比较图像,检查sapientpro/image-comparator
Requires
- php: ^8.1
- ext-gd: *
This package is auto-updated.
Last update: 2024-09-11 13:01:19 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
如果比较的图像已旋转,可以传递旋转角度。您必须传递\枚举类中的以下值: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页面上了解有关可用方法的更多信息