sapientpro/image-comparator

使用PHP比较图像

v1.1.0 2024-09-20 10:44 UTC

This package is not auto-updated.

Last update: 2024-09-20 11:36:45 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

如果比较的图像已旋转,可以传递旋转角度。您必须传递 \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()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 页面 上了解有关可用方法的更多信息