Imagemagick的compare命令中使用的算法

Imagemagick的compare命令中使用的算法,imagemagick,Imagemagick,我在我的项目中使用了Imagemagick。我使用ImageMagick的compare命令实现了一个子图像检测系统。它运行良好,产生了良好的效果。通过阅读文章,我了解到ImageMagick会在大图像像素内的每个可能位置比较小图像的像素。我还了解到ImageMagick使用模糊因子检测旋转图像和缩放图像。虽然我对算法的行为有一个粗略的了解,但我找不到任何与该算法相关的文章ImageMagick的算法。你知道这个compare命令的算法是如何工作的吗 ImageMagick中的模糊因子允许比较两

我在我的项目中使用了Imagemagick。我使用ImageMagick的compare命令实现了一个子图像检测系统。它运行良好,产生了良好的效果。通过阅读文章,我了解到ImageMagick会在大图像像素内的每个可能位置比较小图像的像素。我还了解到ImageMagick使用模糊因子检测旋转图像和缩放图像。虽然我对算法的行为有一个粗略的了解,但我找不到任何与该算法相关的文章ImageMagick的算法。你知道这个compare命令的算法是如何工作的吗

ImageMagick中的模糊因子允许比较两个像素,并认为它们是相同的,尽管它们的颜色可能略有不同

理解它的诀窍是考虑以红色、绿色、蓝色、青色、马真塔、黄色和黑色和白色为顶点的RGB彩色立方体。100%的模糊因子表示该立方体中可能存在的最大距离,即从黑色到白色的对角线长度,所有东西都是相对于该距离缩放的。图中用虚线表示

一般来说,我建议使用百分比值而不是绝对值,因为绝对模糊因子255意味着8位图像上的所有颜色都相同(黑色=白色),而在16位图像上,很难看到两种颜色相差255

例如,让我们看看单个黑色像素是否与具有49%模糊度的单个中灰色像素相同:

compare -metric ae -fuzz 49% xc:black xc:gray null:
1
不,它是不同的,有一个像素的差异。现在,让我们再次尝试允许像素有51%的差异,但仍然匹配:

compare -metric ae -fuzz 51% xc:black xc:gray null:
0

现在,它们被认为是相同的。

ImageMagick中的模糊因子允许比较两个像素,并认为它们是相同的,尽管它们的颜色可能略有不同

理解它的诀窍是考虑以红色、绿色、蓝色、青色、马真塔、黄色和黑色和白色为顶点的RGB彩色立方体。100%的模糊因子表示该立方体中可能存在的最大距离,即从黑色到白色的对角线长度,所有东西都是相对于该距离缩放的。图中用虚线表示

一般来说,我建议使用百分比值而不是绝对值,因为绝对模糊因子255意味着8位图像上的所有颜色都相同(黑色=白色),而在16位图像上,很难看到两种颜色相差255

例如,让我们看看单个黑色像素是否与具有49%模糊度的单个中灰色像素相同:

compare -metric ae -fuzz 49% xc:black xc:gray null:
1
不,它是不同的,有一个像素的差异。现在,让我们再次尝试允许像素有51%的差异,但仍然匹配:

compare -metric ae -fuzz 51% xc:black xc:gray null:
0

现在它们被认为是一样的。

在我的工作中,我目前正在开发一种工具,当PDF页面太重(向量太多等)时,它会对其进行一些复杂的优化,但有时由于PDF对象的绘图顺序,图像的矩形部分会变白

我决定使用ImageMagick v6的比较工具(追溯兼容性问题暂时禁止v7)检查处理后的页面呈现与原始呈现的对比,并检测何时发生了意外

我在呈现与原始页面几乎相同的页面上测试了可用的度量参数,而有一个页面出现了白色部分,使得呈现非常不同

我使用-fuzz 10%接受轻微的颜色变化,并在我的工具中使用99表示JPG质量,这样JPEG压缩不会产生太多差异。在这一点上要小心,因为jpg压缩的低质量迫使您增加模糊因素,有丢失主要视觉差异的风险。不幸的是,您在JPG标题中找不到这些信息

我把我的图片制作成中等分辨率(150 dpi),因为低分辨率与低JPG质量相似,并且产生了太多的差异。渲染的分辨率相同(549*819=449 631像素),比较工具在另一幅图像中查找图像的一部分时并不是很强大。(为此,您最好使用OpenCV。)

下面是一个表格,在我的工具的三个不同页面上有一些重要的结果,然后是我对每个指标的解释

AE代表绝对误差计数。这个度量粗略地给出了被认为是不同的像素数量,在我使用的10%模糊接受范围内。在几乎相同的渲染上,该值通常非常低,总共450K上只有18或1400个像素,而非常不同的图像显示几乎40K个不同的像素。我认为这个指标可以对照总像素的低百分比进行检查,但在我的情况下,这还不够独特。假设我有1%=4500像素,如果它们只出现在一个矩形中,这是不可忽略的。它可以用于地理分散因子,但这更像是OpenCV的工作

MEPP是每像素的平均误差。正如所有的平均统计数据一样,解释起来并不明显,但结果却非常独特。从相同图像的6K跳到不同图像的1.7M。问题是确定一个极限值。你可以在我的表中看到,我有一个470K的页面,但这是一个视觉上可以接受的渲染工件。那么,什么是可接受的值?与平均值一样,显著性可能被证明是非常任意的,并不总是合适的。找到合理限度的唯一方法是对重要案例进行大量测量,可能使用机器学习

MSE度量是平均误差平方,即信道误差平方的平均值。平方增量值在统计学中通常更为重要,因为它们降低了微小差异,并突出了主要差异。(线性回归相关系数得益于这种数学行为。)