2017-08-29 102 views
1

我有渲染使用Adobe PDF引擎PDF文件以及其它PDF裂口。我想尝试找出他们渲染不同的地方。问题是它们都呈现略微不同的抗混叠,颜色和极小的位置差异。我更关心更大的差异。我想比较附件match1.pngmatch2.png。这两个应该匹配。文件diff1.pngdiff2.png不应该匹配。他们应该失败,因为那个人失踪了。我曾与ImageMagick的比较,但没有得到足够好的结果忽略轻微的渲染差异,只专注于主要的。我认为下面的算法可以工作,但我不知道如何读取PNG文件并逐个像素地比较它们。比较图像的呈现差异(忽略抗锯齿)

sample image files

  1. 在ImageA每个像素比较在ImageB相同的像素。也比较每个相邻像素ImageB
  2. 查找在ImageB所有测试像素的最近的匹配像素。
  3. 商店这个最接近匹配的像素作为用于ImageA该像素差分索引的色差。
  4. 对ImageA中的每个像素重复此计算。
  5. 将差值标准化以使最小差值为零。未归一化的值可能是(3,8,5,18),归一化值可能是(0,5,2,15)或某种其他类型的归一化函数。
  6. 然后计算有多少像素超过阈值,比如5或其他。然后,可以使用这个“坏”像素的计数来计算其中一个图像中存在渲染错误的概率。

这只是一个样本算法。我不知道如何逐个像素地处理PNG文件。我会开到PHP的解决方案,或者使用命令行工具,如ImageMagick的解决方案等

回答

0

如果你忽悠两个匹配的图像(交替显示一个接着另一个,来回),你会看到,无论橙色的颜色是不同的。这不仅仅是由于边缘处的抗锯齿造成的差异。

所以使用ImageMagick 6,比较会表现出相当多的变化(如红色)。如果使用Imagemagick 7,请使用magick比较。见http://www.imagemagick.org/Usage/compare/#compare

compare -metric rmse match1.png match2.png match_diff.png 
2304.18 (0.0351595) 

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

enter image description here

另一种方式来看到不同的是用-compose差异。结果越差越多。

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

enter image description here

这并不表现出很大的不同,所以所有值仅略有不同。但通过扩展动态范围,你可以看到它最不同的地方。

检查相邻像素的一种方法是重复比较,在每个方向上移动一个图像1个像素(使用-roll + X + Y),也许使用-shave XxY修剪每个图像周围的1个像素。你可以在循环中做到这一点,并保存每个结果。然后使用-evaluate-sequence min查找同一像素位置上每个图像的最小值(最接近的像素值)。这相当于搜索比较的3x3邻域。问题是你不知道哪个图像给出了最大的结果。

enter image description here

附:您也可以使用比较测量AE -fuzz 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个不匹配的像素。这里是他们不同的地方。

enter image description here

0

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

下面是一个使用php-vips的实现:

#!/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 

在第一对13的颜色渲染只是差异,在第二个55额外的逗号。它在地图上非常明显:

enter image description here