如何比较两张图片并忽略某些区域

3
我有一组回归测试,可以自动从我的iPhone应用程序中获取截图。 我使用Imagemagick将截屏与已保存的参考截屏进行比较。 简而言之:
$ compare -metric AE new.png ref.png diff.png
0

但是,屏幕的某些区域对于这个测试并不重要,我想忽略它们(例如:菜单面板、状态图标等)。

我希望在我的参考图像中将这些区域空白处理。最理想、最简单的方法是,只需在我不想比较的区域周围绘制透明块即可。

但是,如何告诉imagemagick忽略这些透明区域呢?

这将提取出阿尔法区域,并为透明区域生成黑色,其他区域生成白色:

$ convert ref.png -alpha extract ref_mask.png

更好的方式是将白色作为透明度,黑色作为其他所有颜色的替代。
$ convert ref.png -alpha extract -negate ref_mask.png

我可以将这个遮罩与比较功能组合使用吗?

非常感谢。

3个回答

4
您对使用透明度在参考图像中遮罩感兴趣区域的想法是正确的。您需要使用进程替换来解决这个问题——即将一个命令的输出转换成另一个命令的文件输入。所以,如果您想比较两个文件的前三行,可以这样做:
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上)。
以及b.png 还有c.png 所以,如果我运行它们,我会得到这个结果:
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
看一下 ImageMagick 的 compare 文档,你可以使用 compare 命令和标志。
-extract geometry   //extract area from image

不,这并不是很有用,因为它需要通过矩形指定所有区域。那将非常耗时。我心中所想的工作流程只是编辑区域图像并阻止无关区域。例如,可能需要删除十几个区域。但还是感谢您的建议。 - peterept
是的,我对同样的事情感兴趣,但我想忽略圆形选择区域外的部分... - Aesthir

-4

看一下Visual CI

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接