microweber-deps/image-comparator

使用PHP比较图像,检查sapientpro/image-comparator

dev-master 2024-03-11 12:03 UTC

This package is auto-updated.

Last update: 2024-09-11 13:01:19 UTC


README

https://packagist.org.cn/packages/sapientpro/image-comparator https://packagist.org.cn/packages/sapientpro/image-comparator https://packagist.org.cn/packages/sapientpro/image-comparator

Image Comparator是一个用于图像比较和散列的PHP库。您可以使用感知散列方法比较2个或更多图像。

基于https://github.com/kennethrapp/phasher包,支持PHP 8和PHPUnit。原始项目于2017年11月被放弃。

感知散列是一种生成图像散列的方法,允许通过相似度索引比较多个图像。您可以在The Hacker Factorphash.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

Equals1 Equals2

现在,让我们比较它们

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

结果越高,图像的相似度越高。

让我们比较不同的图像

Equals1 Equals2

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()detectArrayhashImage()方法

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页面上了解有关可用方法的更多信息