图像比较器是用于图像比较和哈希的PHP库。您可以使用感知散列方法比较2和更多图像。
基于https://github.com/kennethrapp/phasher软件包,并提供php 8和Phpunit支持。原始项目于2017年11月放弃。
感知散列是一种生成图像哈希的方法,该方法允许通过相似性索引比较多个图像。您可以在hacker factor和phash.org上找到更多信息。
要安装库,请运行:
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 ' ); // SapientProImageComparatorImageResourceException: 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 degress, D90 = 90度, D180 = 180 = 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;默认情况下,使用平均散列算法将图像哈希,该算法是在SapientProImageComparatorStrategyAverageHashStrategy中实现的。该策略是在ImageComparator的构造函数中初始化的。
也可以使用差异散列算法,该算法在sapientpro imagecomparator strument districhaststrategy中实现。要使用它,您需要调用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页面中阅读有关可用方法的信息