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

时间:2015-03-24 09:57:10

标签: java compare imagemagick png similarity

我有两种不同的算法,它们将图像作为输入。图像具有不同颜色的多边形。该算法“简化”了这些多边形(使它们具有较少的角和边)并去除了太小的多边形。

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

这两张图片

image 1image 2

应具有50%的相似性,但根据该算法,它们的相似度为80%。

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

1 个答案:

答案 0 :(得分:5)

您可以像这样使用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表示"告诉我绝对错误" ,即两张图片之间不同的像素数。在这种情况下,答案是1161,它恰好是像素的一半,即50%。

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

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%