【问题标题】:Measure similarity of two images in Java or ImageMagick在 Java 或 ImageMagick 中测量两个图像的相似度
【发布时间】:2015-03-24 09:57:10
【问题描述】:

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

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

这两张图

,

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

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

【问题讨论】:

  • 对于这些图像,蓝色和绿色通道的 100% 相等,而红色通道的 50% 相等。所以 80(或更确切地说是 83)% 相等有意义吗?可能不是你要找的东西...... ;-)
  • 我知道,但我需要一种方法来衡量相似度,即保留哪些像素以及更改哪些像素

标签: java compare imagemagick png similarity


【解决方案1】:

你可以像这样使用 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% 的输出,你可以像这样使用 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%

【讨论】:

  • 感谢您的回答,看起来很有希望。虽然我不明白 n=$ 部分.. 我使用 Windows 提示符
  • n=$(...) 表示将变量n 设置为在括号内运行命令的结果(即输出)。因此,在您的示例中,n 获得值 1161。这是一个Unix bash 功能 - 有一个 Windows 等效功能 - 我会为你找到它。
  • 它在这里... ss64.com/nt/for_cmd.html 所以,你需要做一些类似... FOR /F %%G IN ('compare -metric ae a.png b.png null:') DO @SET n=%%G
  • 我想出了一种糟糕的 Windows-y 方法,请查看更新的答案。
  • 谢谢,它成功了。是的,不幸的是它必须在窗户上-.-
猜你喜欢
  • 2020-01-14
  • 2014-10-06
  • 2023-04-03
  • 2011-11-16
  • 2010-09-06
  • 2014-04-21
  • 2020-07-20
  • 2014-10-03
  • 2012-06-22
相关资源
最近更新 更多