Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 比较图像的渲染差异(忽略抗锯齿)_Image_Compare_Imagemagick - Fatal编程技术网

Image 比较图像的渲染差异(忽略抗锯齿)

Image 比较图像的渲染差异(忽略抗锯齿),image,compare,imagemagick,Image,Compare,Imagemagick,我有一个PDF文件,我使用Adobe PDF引擎以及另一个PDF rip呈现。我想尝试确定它们渲染不同的地方。问题是,它们都使用略有不同的反别名、颜色和非常小的位置差异进行渲染。我更关心的是更大的差异。我想比较附件match1.png和match2.png。这两个应该匹配。文件diff1.png和diff2.png不应匹配。他们应该失败,因为其中一个丢失了一个字母。我使用过ImageMagick的比较,但是没有得到足够好的结果来忽略细微的渲染差异,而只关注主要的渲染差异。我认为下面的算法可以工作

我有一个PDF文件,我使用Adobe PDF引擎以及另一个PDF rip呈现。我想尝试确定它们渲染不同的地方。问题是,它们都使用略有不同的反别名、颜色和非常小的位置差异进行渲染。我更关心的是更大的差异。我想比较附件
match1.png
match2.png
。这两个应该匹配。文件
diff1.png
diff2.png
不应匹配。他们应该失败,因为其中一个丢失了一个字母。我使用过ImageMagick的比较,但是没有得到足够好的结果来忽略细微的渲染差异,而只关注主要的渲染差异。我认为下面的算法可以工作,但我不确定如何读取PNG文件并逐像素进行比较

  • 将ImageA中的每个像素与ImageB中的相同像素进行比较。还要与图像B中的每个相邻像素进行比较
  • 从ImageB中的所有测试像素中查找最近的匹配像素
  • 将此最接近匹配像素的色差存储为ImageA中该像素的色差索引
  • 对ImageA中的每个像素重复此计算
  • 对差值进行规格化,使最小差值为零。未规范化的值可能是(3,8,5,18),规范化的值可能是(0,5,2,15)或其他类型的规范化函数
  • 然后计算超过阈值的像素数,比如说,5或其他。然后,此“坏”像素计数可用于计算其中一个图像中存在渲染错误的概率

  • 这只是一个示例算法。我不知道如何逐像素处理PNG文件。我对PHP解决方案或使用命令行工具(如imagemagick等)的解决方案持开放态度。

    如果您闪烁两个匹配图像(交替显示一个,然后显示另一个,前后显示),您将看到两个橙色都不同。这不仅仅是由于边缘的抗锯齿造成的差异

    因此,使用Imagemagick 6,compare将显示相当多的更改(红色)。如果使用Imagemagick 7,请使用magick compare。看

    这里的差异为3.5%,但差异图像显示大量红色,因为每个像素都有不同的值

    查看差异的另一种方法是使用-compose差异。结果越白,差异越大

    convert match1.png match2.png -compose difference -composite match_diff2.png
    

    这并没有显示太大的差异,所以所有的值都只是略有不同。但是,通过拉伸动态范围,您可以看到最不同的地方

    检查相邻像素的一种方法是重复比较,在每个方向上移动一个图像1个像素(使用-roll+X+Y),并可能使用-shave XxY修剪每个图像周围的1个像素。您可以在循环中执行此操作并保存每个结果。然后使用-evaluate sequence min查找同一像素位置处每个图像的最小值(最接近的像素值)。这就相当于搜索一个3x3的邻居。问题是你不知道哪张图片的结果最大

    另外,您还可以使用比较-度量AE-模糊5%。模糊值将允许比较忽略该百分比内的值。这在Imagemagick 6.9.9.10中似乎不起作用,但在Imagemagick 7.0.6.10中起作用

    im7 magick compare -metric AE -fuzz 5% match1.png match2.png match_diff3.png
    
    219487

    这表示有219487个任意数量的不匹配像素。这里是他们的不同之处


    我会稍微模糊图像以去除任何细微的细节,然后寻找最大的差异。一个简单的差异度量是。做一些非常相似的事情(如果有点喜欢的话)

    下面是一个使用以下内容的实现:

    第一对中的13只是颜色呈现上的差异,第二对中的55是额外的逗号。它在地图图像上非常可见:

    im7 magick compare -metric AE -fuzz 5% match1.png match2.png match_diff3.png
    
    #!/usr/bin/env php
    <?php
    
    require __DIR__ . '/vendor/autoload.php';
    use Jcupitt\Vips;
    
    $a = Vips\Image::newFromFile($argv[1]);
    $b = Vips\Image::newFromFile($argv[2]);
    
    $a = $a->gaussblur(2);
    $b = $b->gaussblur(2);
    $diff = $a->dE76($b);
    
    # output a 500 pixel across difference map
    $scale = 500.0 / $diff->width;
    $diff->multiply(5)->resize($scale)->writeToFile("map.png");
    
    echo("maximum image difference is " . $diff->max() . " dE76\n");
    
    $ ./measure_diff.php match1.png match2.png 
    maximum image difference is 13.739426612854 dE76
    $ ./measure_diff.php diff1.png diff2.png 
    maximum image difference is 55.040554046631 dE76