2017-08-29 205 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