图像差异保留颜色以进行叠加

Image diff preserving color for overlaying

我有两张几乎相同的彩色图片。我想生成一个透明图像,可以覆盖在第一张图像上,使其看起来像第二张图像。我能找到的所有图像差异工具都无法按照我需要的方式保留颜色。有任何想法吗? (最好是Linux命令行)

这些是我目前正在使用的测试图像。 理想情况下,结果应该是这样的,但准确到差异。 (这个不能加阴影,得单独渲染)

您可以在命令行中使用 ImageMagick 执行此操作,如下所示。我将向您展示我采取的步骤以及原因,以便您可以随时偏离我的答案,并希望得到您想要的确切结果。

这是我的初步尝试:

magick compare 1.jpg 2.jpg result.png

这是一个开始,但不幸的是你使用了 JPEG,所以到处都是丑陋的块状伪像,让我们用一些 fuzz 来删除它们 - 不过理想情况下,你会使用无损 PNG 而不是 JPG:

magick compare -fuzz 10% 1.jpg 2.jpg result.png

现在我们可以看到两个新问题 - ImageMagick 好心地保留了降低饱和度的原始图像作为我们的参考,并且差异已用纯红色着色。所以我们要去掉原来的背景图,把高光和低光的颜色改成白色和黑色来做一个改变蒙版:

magick compare -fuzz 10% 1.jpg 2.jpg -compose Src -highlight-color white -lowlight-color black mask.png

如果我们现在采用该蒙版并将其作为透明层引入原始图像,则其他所有内容都会变得透明:

magick 1.jpg mask.png -compose CopyOpacity -composite result.png


顺便说一句,您可以将它变成一个单行文件,从而避免在磁盘上需要一个中间文件,如下所示:

magick compare -fuzz 10% 1.jpg 2.jpg -compose Src -highlight-color white -lowlight-color black png: | magick 1.jpg - -compose CopyOpacity -composite result.png

第一个 magick 在其 stdout 上生成 PNG 格式的蒙版。第二个 magick 从其 stdin 读取掩码并将其作为 alpha 通道放入 1.jpg