如何比较忽略区域的2个图像

时间:2013-12-14 11:20:17

标签: imagemagick

我有一套回归测试,可以自动从我的iPhone应用程序中截取屏幕截图。

我正在使用Imagemagick将屏幕截图与保存的参考屏幕截图进行比较。

简单地:

$ compare -metric AE new.png ref.png diff.png
0

但是,屏幕的某些区域对此测试不感兴趣,我想忽略它们(例如:菜单面板,状态图标等)。

我想在我的参考图像中删除这些区域。理想情况下,最简单的说,我只是在我不想比较的区域周围绘制透明块。

但我如何告诉imagemagick忽略那些透明区域?

这会提取出alpha区域并为其他地方生成透明和白色的BLACK:

$ convert ref.png -alpha extract ref_mask.png

更好的是,这会使alpha为白色,而其他所有内容为黑色:

$ convert ref.png -alpha extract -negate ref_mask.png

我可以将该面具与比较结合起来吗?

非常感谢

3 个答案:

答案 0 :(得分:4)

您的想法是在参考图像中使用透明度来掩盖感兴趣的区域。您需要使用bash进程替换来解决此问题 - 从而使命令的输出看起来像另一个命令的文件。所以你想diff两个文件的前三行,你会这样做:

diff <(head -3 file1) <(head -3 file2)

并且两个head中的两个<(...)命令的输出看起来都像filediff

所以,使用ImageMagick,你需要这样的东西:

compare -metric AE <(convert input.png ref.png -compose copy-opacity -composite png:) ref.png diff.png

因此,首先查看<()中的部分。它说取文件input.png并将其透明度替换为参考图像ref.png的透明度。然后,结果被强制为PNG类型并写在stdout上。然后convert命令实际上看到了这个:

compare -metric AE <file containing masked input.png> ref.png diff.png 

这是我的ref.png(请勿尝试使用此实际图片,因为我已经人工制作棋盘以显示SO的透明度)

enter image description here

b.png

enter image description here

c.png

enter image description here

所以,如果我运行这些,我会得到这个:

compare -metric AE <(convert b.png ref.png -compose copy-opacity -composite png:) ref.png diff.png
0


compare -metric AE <(convert c.png ref.png -compose copy-opacity -composite png:) ref.png diff.png
3245

也就是说,b.png与参考图像相同,因为蓝色方块位于透明区域。

答案 1 :(得分:1)

看看ImageMagick 比较 documentation,您可以将compare命令与标志一起使用

-extract geometry   //extract area from image

答案 2 :(得分:-3)

查看Visual CI

这是一个用于在持续集成中比较图像的软件。 它允许您(使用UI)选择应该比较图像的哪些部分。