使用 ImageMagick“比较”图像

问题描述 投票:0回答:3

如何获得两幅图像之间的差异?我有原始图像。有人在原始图像的精确复制品上写了字。现在,我需要将原始内容与图像上的文字进行比较,并仅提取图像格式的文字。

示例:我有一张房子的照片。有人拿了一份并写道:“你好!”在副本上。我想以某种方式比较这两张照片,移走房子,留下一张写着“你好!”的图像。

ImageMagick 可以做到这一点吗?我知道有很多方法可以获取图像之间的统计差异,但这不是我想要的。

image image-processing imagemagick diff difference
3个回答
389
投票

我最喜欢的是这两个:

compare image1 image2 -compose src diff.png
compare image1 image2 -compose src diff.pdf

上述 2 个命令之间的唯一区别:第一个命令以 PNG 文件形式显示两个图像之间的视觉差异,第二个命令以 PDF 形式显示两个图像之间的视觉差异。

生成的 diff 文件以红色显示所有不同的像素。未改变的显示为白色。

简短而甜蜜。

注意,您的图像需要是相同类型。您甚至可以混合 JPEG、TIFF、PNG - 在一种条件下:图像应具有相同的大小(图像尺寸以像素为单位)。输出格式由输出文件名的扩展名决定。

如果您出于某种原因需要比默认分辨率 (72 dpi) 更高的分辨率 - 那么只需添加适当的

-density
参数即可:

compare -density 300 image1 image2 -compose src diff.jpeg

图例

以下是上述命令的变化结果的一些说明。 注意:比较的两个文件是偶数 PDF 文件,因此它也适用于这些文件(只要它们是 1 页)!


左: 带有文本的图像       中: 原始图像      右: 红色像素中的差异(=文本)。 Red difference pixels only; identical pixels are white

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
        diff-compose-default.pdf

这与我之前建议的命令相同。


左: 带文本的图像      中: 原始图像      右: “海绿色”像素的差异。 Seagreen difference pixels only; identical pixels are white

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
       -highlight-color seagreen \
        diff-compose-default.pdf

此命令添加一个参数以使差异像素为“海绿色”而不是默认的红色。


左: 带文本的图像       中: 原始图像       右: 蓝色差异(但有一些上下文背景) Blue difference pixels only; first of the compared images as a lightened-up backgroundl

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -highlight-color blue \
        diff-compose-default.pdf

此命令删除

-compose src
部分——结果是
compare
的默认行为,它将 2 个差异图像中的第一个图像保留为亮化背景。 (这次添加了参数以使差异像素显示为蓝色。)


82
投票

虽然

compare
在许多应用程序中都表现出色,但我发现有时我更喜欢不同的方法,特别是在比较大多数灰度图像时:

convert '(' file1.png -flatten -grayscale Rec709Luminance ')' \
        '(' file2.png -flatten -grayscale Rec709Luminance ')' \
        '(' -clone 0-1 -compose darken -composite ')' \
        -channel RGB -combine diff.png

想法如下:将

file1.png
file2.png
都转换为灰度。然后将第一个作为结果图像的红色通道,第二个作为绿色通道。蓝色通道是使用
darken
组合运算符由这两个通道形成的,这本质上意味着取最小值。

所以两个图像中白色的东西都保持白色。两张图像中黑色的东西都保持黑色。第一张图像中为白色但第二张图像中为黑色的物体会变成红色,而第二张图像中为白色但第一张图像中为黑色的物体会变成绿色。

结果为您提供了一个漂亮的颜色编码图像,您可以轻松地将绿色与第一个输入关联起来,将红色与第二个输入关联起来。这是一个示例,我使用它来比较 LaTeX 的输出与 KaTeX 的输出(在我修复了一些错误以使其更好之前):

enter image description here

您可以组合这些方法,使用

compare
查看哪里更改了某些内容,然后使用上面的内容更详细地查看如何更改。


8
投票

从 ImageMagick 6.3.4 开始,您可以使用

-compose ChangeMask
(另请参阅“删除已知背景” 和以下部分)。 例如,使用 IM7 和这些图像
stone.png
diamond_ore.png
netherrack.png
:
stone.png diamond_ore.png netherrack.png

magick diamond_ore.png stone.png -fuzz 15% -compose ChangeMask -composite diamond_ore_overlay.png
给出:
diamond_ore_overlay.png

然后

magick netherrack.png diamond_ore_overlay.png -composite nether_diamond_ore.png
给出:
nether_diamond_ore.png
(在一个命令中:
magick netherrack.png \( diamond_ore.png stone.png -fuzz 15% -compose ChangeMask -composite +compose \) -composite nether_diamond_ore.png

© www.soinside.com 2019 - 2024. All rights reserved.