在我的工作中,我目前正在开发一种工具,该工具在 PDF 页面太重(矢量过多等)时对它们进行一些复杂的优化,但有时由于绘图顺序而使图像的矩形部分变白PDF 对象。
我决定使用ImageMagick v6的比较工具(回溯兼容性问题暂时禁止v7),将处理后的页面渲染与原始渲染进行比较,并检测何时出现事故。
我已经在渲染与原始页面几乎相同的页面上测试了可用的 -metrics 参数,而有一个页面发生了白化部分,使得渲染非常不同。
我使用 -fuzz 10% 来接受微小的颜色变化,并在我的工具中使用 99 来获得 JPG 质量,因此 JPEG 压缩不会产生太多差异。请注意这一点,因为 jpg 压缩的低质量会迫使您增加模糊因子,从而可能会丢失主要的视觉差异。遗憾的是,您不会在 JPG 标头中找到相关信息。
我已将图像设为中分辨率 (150 dpi),因为事实证明 lo-res 与低 JPG 质量相似并且产生了太多差异。渲染的分辨率相同(549*819 = 449 631 像素),比较工具在查找另一幅图像中的图像部分方面并不是很强大。 (为此,您最好使用 OpenCV。)
这是一个表格,其中包含我工具中三个不同页面上的一些重要结果,然后是我对每个指标的解释。
AE 代表绝对错误计数。在我使用的 10% 模糊接受范围内,该指标粗略地给出了被认为不同的像素数。在几乎相同的渲染中,这个值通常非常低,总共 450K 上只有 18 或 1400 像素,而非常不同的图像显示近 40K 不同的像素。我认为可以根据总像素的低百分比来检查该指标,但在我的情况下,这还不够独特。假设我有 1% = 4500 像素,如果它们只出现在一个矩形中,则不能忽略。它可能对地理分散因素有用,但这更像是一项 OpenCV 工作。
MEPP 是每像素平均误差。与所有平均统计数据一样,解释起来并不明显,但结果却非常独特。从相同图像的大约 6K 跳跃到不同图像的巨大 1.7M。问题是确定一个极限值。您可以在我的表格中看到我有一个在这个指标上具有 470K 的页面,但它是视觉上可接受的渲染工件。 什么是可接受的值,那么?与平均值一样,显着性可以证明是非常随意的,并不总是合适的。找到合理限度的唯一方法是对重大案件采取大量措施,可能使用机器学习。
MSE 指标是平均误差平方,通道误差平方的平均值。 delta 平方值通常在统计数据中更重要,因为它们会降低次要差异并突出主要差异。 (线性回归相关因子受益于这种数学行为。)这个指标在我的案例中证明非常有趣,因为对于类似案例的值非常一致:即使在具有视觉伪影和 450K 不同像素的页面上,该值也保持在远低于 1 的水平,而带有白色部分的页面跳转到 9。这个 MSE 指标在我的情况下显然非常有用。
NCC 表示标准化互相关。归一化值在我的情况下是不合适的,因为它们会使颜色更接近并减少不同情况之间的差异。您可以在值上看到这一点,虽然相同的渲染非常接近 1,但不同的渲染具有 0.86 的值,与 1 相差不远。
PAE 为您提供所有像素上的颜色通道上的绝对峰值差异,因此它不知道有多少像素是不同的。而且它不适用于 RGB 或 CMYK,因为它不会告诉您关注哪些通道。对我来说没用。
PHASH 是 sRGB 和 HCLp 颜色空间的感知散列。我不太确定这个,但结果非常有趣,因为我的图像是 RGB,主要是因为即使对于具有可接受的视觉伪影的页面,类似渲染的值也远低于 1 - 而不同的渲染给出的值26. 这非常适合我的情况,就像 MSE 一样。我认为这个指标似乎更加突出了颜色值的次要和主要差距之间的差异。
PSNR 是 峰值信噪比:对于 PAE,这是一个峰值,不会告诉您关注多少像素,因此它在我的情况。
RMSE 是 均方根。无论这意味着什么,您都会发现与 MSE 相同的均方行为,因此该值可能会很有趣,因为它比次要差异更能揭示主要差异。在这里,对于相同的图像,我的值为 0.7 和 3.2,对于不同的图像,我的值为 48.7。困难在于确定一个可接受的限度:与 AE 或 MEPP 一样,唯一的方法是针对许多情况进行大量测试和测量值,然后确定一个合适的值。机器学习可以为此提供帮助。
作为结论,我决定使用 PHASH 指标。但这项研究的结论是,您必须在决定要使用的指标之前进行测试和测量,因为比较上下文可能非常不同,指标可能会显示非常不同的行为。
如果您必须比较来自不同来源的图像、全局图像的一部分或具有较大光照变化的图像,OpenCV 会更加合适。此外,它很容易从 Python 和 C++ 中使用。 ImageMagick 在我的情况下非常好,因为我是生成这两个图像的人。