首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何比较2幅忽略区域的图像

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

Stack Overflow用户
提问于 2013-12-14 11:20:17
回答 3查看 2.6K关注 0票数 3

我有一组回归测试,这些测试会自动从我的iPhone应用程序中获取屏幕快照。

我使用Imagemagick来比较截图和保存的参考截图。

简单地说:

代码语言:javascript
复制
$ compare -metric AE new.png ref.png diff.png
0

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

我想在我的参考图像中空白这些区域。理想情况下,也是最简单的情况下,我只是在我不想比较的区域周围画出透明的块。

但是,我怎样才能让想象者忽略那些透明的区域呢?

这将提取alpha区域,并生成透明的黑色和其他的白色:

代码语言:javascript
复制
$ convert ref.png -alpha extract ref_mask.png

更好的办法是使阿尔法变成白色,使其他一切变成黑色:

代码语言:javascript
复制
$ convert ref.png -alpha extract -negate ref_mask.png

我能把面具和比较结合起来吗?

非常感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-27 09:27:30

你是在正确的轨道上,你的想法,使用透明度,在你的参考图像,以掩盖感兴趣的领域。您需要使用bash进程替换来解决这个问题--通过这个方法,命令的输出看起来与另一个命令的文件类似。因此,要对两个文件的前三行进行diff,就可以执行以下操作:

代码语言:javascript
复制
diff <(head -3 file1) <(head -3 file2)

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

因此,对于ImageMagick,您需要这样的东西:

代码语言:javascript
复制
compare -metric AE <(convert input.png ref.png -compose copy-opacity -composite png:) ref.png diff.png

那么,首先看一下<()中的部分。它说要获取文件input.png并将其透明性替换为参考图像ref.png的透明度。结果被迫为PNG类型,并写在stdout上。然后,convert命令实际上看到了以下内容:

代码语言:javascript
复制
compare -metric AE <file containing masked input.png> ref.png diff.png 

这是我的ref.png (不要尝试使用这个实际的图像,因为我人为地做了棋盘以在SO上显示透明度)

b.png

c.png

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

代码语言:javascript
复制
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和参考图像是一样的,因为蓝色方块位于透明区域。

票数 4
EN

Stack Overflow用户

发布于 2013-12-14 11:30:41

查看ImageMagick compare 文档,您可以使用comand和标志

代码语言:javascript
复制
-extract geometry   //extract area from image
票数 1
EN

Stack Overflow用户

发布于 2014-10-26 23:14:13

看看视觉CI

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

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20582620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档