Comporator Image - это библиотека PHP для сравнения изображений и хэширования. Вы можете сравнить 2 и более изображений, используя метод хэширования восприятия.
На основе https://github.com/kennethrapp/phasher пакет с поддержкой PHP 8 и PhpUnit. Первоначальный проект был заброшен в ноябре 2017 года.
Hashing Hashing - это метод генерации хэша изображения, который позволяет сравнивать несколько изображений с помощью индекса сходства. Вы можете узнать больше на хакером и 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 ImagerotationAnger Enum с одним из следующих значений: D0 = 0 Degress, 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; По умолчанию изображения хешируются с использованием алгоритма среднего хеширования, который реализован в SapientProImageComparatorStrategyAverageHashStrategy . Эта стратегия инициализируется в конструкторе ImageComparator .
Также возможно использовать алгоритм разницы в хэшинге, реализованный в SapientPro ImageComparator Strategy Divinghashstrategy. Чтобы использовать его, вам необходимо назвать метод 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 Вы можете прочитать о доступных методах на нашей странице вики