在 Java 或 ImageMagick 中测量两个图像的相似性

Measure similarity of two images in Java or ImageMagick

我有两种将图像作为输入的不同算法。该图像具有不同颜色的多边形。该算法 "simplifies" 这些多边形(使它们具有较少的角和边)并删除太小的多边形。

这两种算法的工作方式不同,我想知道哪一种实际上更接近原始图片。我遇到了 this,但这并不是我想要的。

这两张图片

,

应该有 50% 的相似度,但根据那个算法,它们的相似度是 80%。

我还发现了一个名为ImageMagick 的工具,它可以比较两个图像。但是我不确定输出的含义是什么以及如何使用它们来解决我的问题。

您可以像这样使用 ImageMagick 来比较您的两个图像:

compare -metric ae a.png b.png null:
1161

或者,使用 convert

的较长形式
convert -metric ae a.png b.png -compare -format "%[distortion]" info:
1161

-metric ae的意思是"tell me the absolute error",即两幅图像之间不同的像素数。在这种情况下,答案是 1161,正好是像素的一半,即 50%。

如果您特别想要 50% 的输出,您可以像这样使用 ImageMagick 对图像尺寸进行数学计算,如果您使用 bash:

n=$(compare -metric ae a.png b.png null:)
identify -format "%[fx:$n*100/(w*h)]" a.png

或更长的形式,使用 convert:

n=$(compare -metric ae a.png b.png null:)
convert -format "%[fx:$n*100/(w*h)]" a.png info:
50

如果您处理的是 jpg 图像(因此有损压缩和人工制品)而不是 png 图像,您可能需要添加百分之几的 fudge factor,使用 -fuzz 参数允许几乎相同的像素计为相同:

convert -fuzz 10% -metric ae ....

如果你不幸不得不使用Windows,上面的方法是晦涩难懂的,但看起来像这样:

@echo off
for /f "tokens=1,2,3,*" %%G in ('convert -metric ae a.png b.png -compare -format "%%w %%h %%[distortion]" info:') DO set /a percent=(%%I * 100) /(%%G * %%H)
echo %percent%