【发布时间】:2021-11-24 01:03:02
【问题描述】:
我有两张颜色几乎相同的图像。我想生成一个透明图像,可以覆盖在第一张图像上,使其看起来像第二张。我能找到的所有图像差异工具都不会按照我需要的方式保留颜色。有任何想法吗? (最好是 Linux 命令行)
【问题讨论】:
标签: linux image colors diff difference
我有两张颜色几乎相同的图像。我想生成一个透明图像,可以覆盖在第一张图像上,使其看起来像第二张。我能找到的所有图像差异工具都不会按照我需要的方式保留颜色。有任何想法吗? (最好是 Linux 命令行)
【问题讨论】:
标签: linux image colors diff difference
您可以在命令行中使用 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 将掩码作为PNG 生成到它的stdout 上。第二个magick 从它的stdin 中读取掩码并将其放入1.jpg 作为alpha 通道:
【讨论】:
convert .... -compare ...imagemagick.org/script/command-line-options.php#compare
-compose src(摆脱不饱和背景)以及我真正想做的-compose difference - 所以我分两步完成。
@Mark 我尝试了高光和低光问题。我在github.com/ImageMagick/ImageMagick/issues/4312 发布了一个问题
-define compose:highlight-color=white 或其他东西来完成。
@Mark 不,不是那样。我认为这些“减号”设置将在后续版本中添加。我认为这是创建 -compare 选项时的疏忽