O comparador de imagens é uma biblioteca PHP para comparação e hash de imagem. Você pode comparar 2 e mais imagens usando o método de hash perceptivo.
Baseado no pacote https://github.com/kennethrapp/phasher, com suporte Php 8 e Phpunit. O projeto original foi abandonado em novembro de 2017.
O hash perceptivo é um método para gerar um hash de uma imagem que permite que várias imagens sejam comparadas por um índice de similaridade. Você pode descobrir mais no Hacker Factor e Phash.org.
Para instalar a biblioteca, execute:
composer require sapientpro/image-comparator
ImageComparator é a classe principal da biblioteca:
use SapientPro ImageComparator ImageComparator ;
$ imageComparator = new ImageComparator()Depois de criar uma instância, você pode usar um dos métodos disponíveis:
$ imageComparator -> compare ( ' your-images/your-image1.jpg ' , ' your-images/your-image12.jpg ' ); Se o caminho da imagem não puder ser resolvido, ImageResourceException será jogado:
$ imageComparator -> hashImage ( ' your-images/non-existent-image.jpg ' ); // SapientProImageComparatorImageResourceException: Could not create an image resource from fileExemplo de uso:
Temos duas imagens:
https://github.com/sapientpro/image-coMparator/blob/master/tests/images/ebay-image.png?raw=true


Agora, vamos compará -los:
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.5Quanto maior o resultado, maior a semelhança das imagens.
Vamos comparar imagens diferentes:


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 O ângulo de rotação pode ser passado se a imagem comparada for girada. Você deve passar sapientpro imageComparator enum imagerotetationangle enum com um dos seguintes valores: D0 = 0 degress, D90 = 90 graus, D180 = 180 graus, D270 = 270 graus
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 Você também pode usar o método detect() que girará a imagem comparada e retornará a maior porcentagem de similaridade:
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 Com os métodos compareArray() e detectArray() você pode comparar a imagem de origem com qualquer número de imagens que deseja. O comportamento é o mesmo que nos métodos compare() e 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] Se necessário, você pode criar um recurso de imagem quadrada a partir de outra imagem e passá -la para compare() , compareArray() , detect() , detectArray e hashImage() métodos:
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; Se necessário, você pode converter a matriz resultante de hashImage() em uma string binária e passá -la para 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; Por padrão, as imagens são hashes usando o algoritmo médio de hash, que é implementado no SapientProImageComparatorStrategyAverageHashStrategy . Essa estratégia é inicializada no construtor do ImageComparator .
Também é possível usar o algoritmo de hash de diferença, implementado no SapientPro ImageComParator Strategy DiftiShashStrategy. Para usá -lo, você precisa ligar para o método setHashStrategy() do ImageComparator e passar a instância da estratégia:
use SapientPro ImageComparator Strategy DifferenceHashStrategy ;
$ imageComparator -> setHashStrategy ( new DifferenceHashStrategy ());
$ imageComparator -> hashImage ( ' image1.jpg ' ); Se a estratégia for definida por setHashingStrategy() , ela será usada sob o capô em outros métodos de comparação:
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 Você pode ler sobre os métodos disponíveis em nossa página wiki