Imagemagick的比较命令中使用的算法

时间:2017-04-10 13:12:01

标签: imagemagick

我在我的项目中使用了Imagemagick。我使用ImageMagick的compare命令实现了子图像检测系统。它运作良好,效果很好。通过阅读文章我知道ImageMagick在较大图像的像素内的每个可能位置比较小图像的像素。我也知道ImageMagick使用模糊因子检测旋转图像和缩放图像。虽然我对如何粗略了解如何算法表现我无法找到任何与ImageMagick算法相关的文章。关于比较命令算法实际如何工作的任何想法?

2 个答案:

答案 0 :(得分:1)

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

理解它的技巧是考虑RGB颜色立方体,红色,绿色,蓝色,青色,洋红色,黄色和黑色和白色作为顶点。模糊因子100%表示该立方体中的最大可能距离,即从黑色到白色的对角线长度,并且所有内容都相对于该比例缩放。它在此图中以虚线显示。

enter image description here

一般情况下,我建议使用百分比值而不是绝对值,因为绝对模糊因子为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

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

答案 1 :(得分:1)

在我的工作中,我目前正在使用一种工具,该工具在PDF页面过重(矢量等过多)时会对其进行一些复杂的优化,但有时会由于绘制顺序而使图像的矩形部分变白PDF对象。

我决定使用ImageMagick v6的比较工具(目前存在兼容性问题,禁止使用v7)检查处理原始渲染后的页面渲染并检测是否发生事故。

我已经在渲染与原始渲染几乎相同的页面上测试了可用的-metrics参数,而在一页中正在发生白色部分的情况下,渲染变得非常不同。

我使用 -fuzz 10%接受较小的颜色变化,并在工具中使用 99以获得JPG质量,因此JPEG压缩不会产生太大差异。请注意这一点,因为 jpg压缩的质量较低会迫使您增加模糊因素,但有可能会丢失主要的视觉差异。不幸的是,您无法在JPG标头中找到该信息。

我将图像设为中分辨率(150 dpi),因为事实证明低分辨率类似于JPG低质量,并且产生了太多差异。渲染具有相同的分辨率(549 * 819 = 449631像素),比较工具在查找另一幅图像中的一部分图像时并不是很强大。 (为此,最好使用OpenCV。)

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

All ImageMagick results on identical and different images same resolution and jpeg quality

AE代表绝对错误计数。在我使用的10%模糊接受度范围内,该指标粗略地给出了被视为不同的像素数量。在几乎相同的渲染上,此值通常非常低,总共185,000像素中只有18个或1400个像素,而完全不同的图像显示了近40K个不同的像素。我认为可以对照总像素的较低百分比来检查此指标,但就我而言,这还不够鲜明。假设我有1%= 4500个像素,如果它们仅出现在一个矩形中,这可能是不容忽视的。结合地理分散因素可能会有用,但这更多是OpenCV的工作。

MEPP是每像素平均错误。与所有<均值>均值统计一样,解释起来并不明显,但结果却非常独特。从相同图像的约6K跃升至不同图像的1.7M。问题在于确定极限值。您可以在我的表格中看到我有一个页面上的该指标为470K,但这是一个视觉上可接受的渲染工件。 那么什么是可接受的值?与平均值一样,重要性可以证明是非常武断的,并不总是合适的。找到合理限制的唯一方法是对重大案件采取很多措施,也许使用机器学习。

MSE指标为均方根误差,即通道均方根误差的平均值。平方差值通常在统计数据中更为重要,因为它们会减小次要差异,并加重主要差异。 (线性回归相关因子受益于这种数学行为。)在我的情况下,此度量标准非常有趣,因为在类似情况下,值非常一致:即使在具有视觉伪像和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非常好,因为我是同时生成两张图像的人