El comparador de imágenes es una biblioteca PHP para la comparación de imágenes y el hash. Puede comparar 2 y más imágenes utilizando el método de hashing perceptual.
Basado en https://github.com/kennethrapp/phasher, con PHP 8 y soporte de phpunit. El proyecto original fue abandonado en noviembre de 2017.
El hash perceptual es un método para generar un hash de una imagen que permite comparar múltiples imágenes por un índice de similitud. Puede obtener más información en Hacker Factor y Phash.org.
Para instalar la biblioteca, ejecute:
composer require sapientpro/image-comparator
ImageComparator es la clase central de la biblioteca:
use SapientPro ImageComparator ImageComparator ;
$ imageComparator = new ImageComparator()Después de crear una instancia, puede usar uno de los métodos disponibles:
$ imageComparator -> compare ( ' your-images/your-image1.jpg ' , ' your-images/your-image12.jpg ' ); Si la ruta de la imagen no se puede resolver, se lanzará ImageResourceException :
$ imageComparator -> hashImage ( ' your-images/non-existent-image.jpg ' ); // SapientProImageComparatorImageResourceException: Could not create an image resource from fileEjemplo de uso:
Tenemos dos imágenes:
https://github.com/sapientpro/image-comparator/blob/master/tests/images/ebay-image.png?raw=true


Ahora, comparémoslos:
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.5Cuanto mayor sea el resultado, mayor es la similitud de las imágenes.
Comparemos diferentes imágenes:


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 El ángulo de rotación se puede pasar si se compara la imagen se gira. Debe pasar sapientpro imageComparator enum imageTationAngle enum con uno de los siguientes valores: D0 = 0 DeRess, D90 = 90 grados, D180 = 180 grados, D270 = 270 grados
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 También puede usar el método detect() que girará la imagen comparada y devolverá el mayor porcentaje de similitud:
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 Con los métodos compareArray() y detectArray() puede comparar la imagen de origen con cualquier cantidad de imágenes que desee. El comportamiento es el mismo que en los métodos compare() y 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] Si es necesario, puede crear un recurso de imagen cuadrado a partir de otra imagen y pasarlo para compare() , compareArray() , detect() , detectArray y 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; Si es necesario, puede convertir la matriz resultante de hashImage() a una cadena binaria y pasarla a 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; De forma predeterminada, las imágenes se hashan utilizando el algoritmo de hashing promedio, que se implementa en SapientProImageComparatorStrategyAverageHashStrategy . Esta estrategia se inicializa en el constructor de ImageComparator .
También es posible usar el algoritmo de hash de diferencia, implementado en sapientpro imageComparator estrategia DiferingHashStrategy. Para usarlo, debe llamar al método setHashStrategy() de ImageComparator y pasar la instancia de la estrategia:
use SapientPro ImageComparator Strategy DifferenceHashStrategy ;
$ imageComparator -> setHashStrategy ( new DifferenceHashStrategy ());
$ imageComparator -> hashImage ( ' image1.jpg ' ); Si la estrategia es establecida por setHashingStrategy() , se usará bajo el capó en otros métodos de comparación:
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 Puede leer sobre los métodos disponibles en nuestra página wiki