比较两个图像以查看它们是否都是相同的文件很容易:抛出文件MD5。但是,通过使用PHP GD来获取两个图像的差异,是否可能甚至似乎合理地确定两个图像是否相同?如果我们要得到两者的区别,并且它都是白色的(我假设是白色甚至黑色),那么我们现在就可以知道它们是否都是同一张照片了?旁注:我想知道是否有可能获得两个大小相等的图像来创建洋葱皮效果:一个是50%的透明度,另一个是50%。
hmmo2u0o1#
大多数其他答案都涉及使用各种哈希函数。这个问题明确地询问比较图像的内容,而不是比较文件。这意味着你最终必须真正理解图像的内容。在PHP中,有两个扩展经常用于此,ImageMagick和GD。ImageMagick通过PHP ImageMagick扩展提供了各种可用于此的工具。http://www.php.net/manual/en/function.imagick-compareimages.php最大的问题是,该库的文档几乎不存在,因此将涉及大量的试错。PHP扩展是ImageMagick库的一个非常薄的 Package 器,因此可以在ImageMagick文档中找到compareimages()函数的行为细节。
slsn1g292#
$md5image1 = md5(file_get_contents($image1)); $md5image2 = md5(file_get_contents($image2)); if ($md5image1 == $md5image2) { }
mbzjlibv3#
libpuzzle是一个可以比较图像的PHP扩展。
wpx232ag4#
在这个 Stackoverflow线程 * 上也提出了类似的问题,我已经开发了一些自己使用的东西。把它贴在这里,这样可以帮助别人。它需要两个(或更多)图像,并为您提供有关检查它们之间差异的选项。选择像决议使用,和严格。我写了一个更全面的*blogpost on it as well**。
bpzcxfmw5#
我编写了一种均方误差比较方法,使用PHP中已经包含的GD Graphics Library。我担心时间,所以我加入了一些选项,例如:
但是从结果来看,如果您正在进行批量操作,也许最好的方法是对选项进行“硬编码”,以避免条件行的“开销”。下面是代码,带有一些 test 和 benchmark:
<?php define('FILENAME1','./image1.png'); define('FILENAME2','./image2.png'); define('OUTEXT','png'); //Output extension /** * Calculate an arbitrary metric of difference between images * * @param resource(gd) $img1 First image * @param resource(gd) $img2 Second image * @param int $resX Scaled width resolution * @param int $resY Scaled height resolution * @param int $pow Mean square error if 2, but could be another power * @param string $channel RGB channel or 'all' for perceived luminance * * @return float the calculated metric */ function diff($img1,$img2,$resX=false,$resY=false,$pow='2',$channel='all'){ //Scaling to image 1 size for default if(!$resX||!$resY){ $resX=imagesx($img1); //width $resY=imagesy($img2); //height } //Use imagescale() function to scale the images $thumb1=imagescale($img1,$resX,$resY); $thumb2=imagescale($img2,$resX,$resY); //Sum of errors $sum=0; for($x=0;$x<$resX;++$x){ for($y=0;$y<$resY;++$y){ //Read pixel bytes $bytes1=imagecolorat($thumb1,$x,$y); $bytes2=imagecolorat($thumb2,$x,$y); //Split the channel values from bytes $colors1=imagecolorsforindex($thumb1,$bytes1); $colors2=imagecolorsforindex($thumb2,$bytes2); //Choose image channel if($channel=='all'){ //Perceived luminance $value1=sqrt(0.2126*$colors1['red']**2+0.7152*$colors1['green']**2+ 0.0722*$colors1['blue']**2); $value2=sqrt(0.2126*$colors2['red']**2+0.7152*$colors2['green']**2+ 0.0722*$colors2['blue']**2); }else{ //RGB channel $value1=$colors1[$channel]; $value2=$colors2[$channel]; } $sum+=abs($value1-$value2)**$pow; } } //Return mean of the error sum return $sum/($resX*$resY); } //Show image in HTML function imgdraw($imgobj){ //Choose function $image="image".OUTEXT; //Capture the image data stream ob_start(); $image($imgobj); $data = ob_get_clean(); //Create and HTML img echo '<img src="data:image/png;base64,'.base64_encode($data).'" />'; } //Load an image function loadimg($filename){ //Get filename extension $ext=substr($filename,strrpos($filename,'.')+1); //Create image object $imagecreate="imagecreatefrom$ext"; return $imagecreate($filename); } //Test $img1=loadimg(FILENAME1); $img2=loadimg(FILENAME2); if( !$img1 || !$img2){ //Problem reading the files die("Error loading image files"); }else{ imgdraw($img1); imgdraw($img2); } //Times for 133x144 pixels png images echo "<p>original size MSE perceived luminance: ".diff($img1,$img2)."</p>"; //time: 0.2281 seconds. echo "<p>original size MSE green channel: ".diff($img1,$img2,false,false,2,'green')."</p>"; //time: 0.1364 seconds. echo "<p>original size linear perceived luminance: ".diff($img1,$img2,false,false,1)."</p>"; //time: 0.1920 seconds. echo "<p>original size linear green channel: ".diff($img1,$img2,false,false,1,'green')."</p>"; //time: 0.1351 seconds. echo "<p>64x64 MSE perceived luminance: ".diff($img1,$img2,64,64)."</p>"; //time: 0.0431 seconds. echo "<p>64x64 MSE green channel: ".diff($img1,$img2,64,64,2,'green')."</p>"; //time: 0.0293 seconds. echo "<p>64x64 linear perceived luminance: ".diff($img1,$img2,64,64,1)."</p>"; //time: 0.0423 seconds. echo "<p>64x64 linear green channel: ".diff($img1,$img2,64,64,1,'green')."</p>"; //time: 0.0293 seconds. echo "<p>16x16 MSE perceived luminance: ".diff($img1,$img2,16,16)."</p>"; //time: 0.0028 seconds. echo "<p>16x16 MSE green channel: ".diff($img1,$img2,16,16,2,'green')."</p>"; //time: 0.0027 seconds. echo "<p>16x16 linear perceived luminance: ".diff($img1,$img2,16,16,1)."</p>"; //time: 0.0027 seconds. echo "<p>16x16 linear green channel: ".diff($img1,$img2,16,16,1,'green')."</p>"; //time: 0.0018 seconds. ?>
pkwftd7m6#
PHP中使用GD库http://www.robert-lerner.com/imagecompare.php的图像比较功能
34gzjxbg7#
不确定它是否那么容易,是否存在解决方案,但您可能会从以下内容中了解图像检测:Face detection with PHPImage Nudity Filter (Class)
scyqe7ek8#
如果你只是比较两个文件,那么散列数据,然后比较是完美的解决方案。如果您正在比较大量的文件,那么最好先根据大小对它们进行排序,然后只与相同大小进行比较。
eqzww0vc9#
如果你使用的是php 8.1或更高版本,你可以使用https://github.com/sapientpro/image-comparator库:
$comparator = new SapientPro\ImageComparator\ImageComparator(); $similarity = $imageComparator->compare('your-images/your-image1.jpg', 'your-images/your-image12.jpg'); echo $similarity; // 82.3
9条答案
按热度按时间hmmo2u0o1#
大多数其他答案都涉及使用各种哈希函数。这个问题明确地询问比较图像的内容,而不是比较文件。
这意味着你最终必须真正理解图像的内容。在PHP中,有两个扩展经常用于此,ImageMagick和GD。
ImageMagick通过PHP ImageMagick扩展提供了各种可用于此的工具。
http://www.php.net/manual/en/function.imagick-compareimages.php
最大的问题是,该库的文档几乎不存在,因此将涉及大量的试错。PHP扩展是ImageMagick库的一个非常薄的 Package 器,因此可以在ImageMagick文档中找到compareimages()函数的行为细节。
slsn1g292#
mbzjlibv3#
libpuzzle是一个可以比较图像的PHP扩展。
wpx232ag4#
在这个 Stackoverflow线程 * 上也提出了类似的问题,我已经开发了一些自己使用的东西。把它贴在这里,这样可以帮助别人。
它需要两个(或更多)图像,并为您提供有关检查它们之间差异的选项。选择像决议使用,和严格。
我写了一个更全面的*blogpost on it as well**。
bpzcxfmw5#
我编写了一种均方误差比较方法,使用PHP中已经包含的GD Graphics Library。
我担心时间,所以我加入了一些选项,例如:
但是从结果来看,如果您正在进行批量操作,也许最好的方法是对选项进行“硬编码”,以避免条件行的“开销”。
下面是代码,带有一些 test 和 benchmark:
pkwftd7m6#
PHP中使用GD库http://www.robert-lerner.com/imagecompare.php的图像比较功能
34gzjxbg7#
不确定它是否那么容易,是否存在解决方案,但您可能会从以下内容中了解图像检测:
Face detection with PHP
Image Nudity Filter (Class)
scyqe7ek8#
如果你只是比较两个文件,那么散列数据,然后比较是完美的解决方案。如果您正在比较大量的文件,那么最好先根据大小对它们进行排序,然后只与相同大小进行比较。
eqzww0vc9#
如果你使用的是php 8.1或更高版本,你可以使用https://github.com/sapientpro/image-comparator库: