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

标签 image compare imagemagick

我有一个使用 Adob​​e PDF 引擎渲染的 PDF 文件以及另一个 PDF rip。我想尝试找出它们呈现不同的地方。问题是它们都使用略微不同的抗锯齿、颜色和非常小的位置差异进行渲染。我更关心更大的差异。我想比较附件 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 等命令行工具的解决方案。

最佳答案

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

因此使用 Imagemagick 6,比较会显示出相当多的变化(如红色)。如果使用 Imagemagick 7,请使用 magick compare。参见 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

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

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

enter image description here

附言您还可以使用 compare -metric 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

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

enter image description here

关于image - 比较图像的渲染差异(忽略抗锯齿),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45946111/

相关文章:

PHP MySQL 显示数据库中具有正确 ID 的图像

java - 具有背景图像和剪切矩形的 JTextPane 问题

java - 在 Android 上强制完全电子墨水刷新

database - 在数据库中存储图像 - 是还是否?

php - 如何使用 php imagick 库使图像看起来像 Canvas 或马桶

Python - 比较两个存在电子邮件但位于不同行的电子邮件列表

Python写入csv,一旦检查字符串是否在csv中

Python - 比较列表列表并选择最大值

python-3.x - Python Windows 10 64bit - 用于 trackpy 的 FFMPEG

javascript - ImageMagick : get image width return undefined