如何获得两幅图像之间的差异?我有原始图像。有人在原始图像的精确复制品上写了字。现在,我需要将原始内容与图像上的文字进行比较,并仅提取图像格式的文字。
示例:我有一张房子的照片。有人拿了一份并写道:“你好!”在副本上。我想以某种方式比较这两张照片,移走房子,留下一张写着“你好!”的图像。
ImageMagick 可以做到这一点吗?我知道有很多方法可以获取图像之间的统计差异,但这不是我想要的。
我最喜欢的是这两个:
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 页)!
左: 带有文本的图像 中: 原始图像 右: 红色像素中的差异(=文本)。
compare \
porsche-with-scratch.pdf porsche-original.pdf \
-compose src \
diff-compose-default.pdf
这与我之前建议的命令相同。
左: 带文本的图像 中: 原始图像 右: “海绿色”像素的差异。
compare \
porsche-with-scratch.pdf porsche-original.pdf \
-compose src \
-highlight-color seagreen \
diff-compose-default.pdf
此命令添加一个参数以使差异像素为“海绿色”而不是默认的红色。
左: 带文本的图像 中: 原始图像 右: 蓝色差异(但有一些上下文背景) l
compare \
porsche-with-scratch.pdf porsche-original.pdf \
-highlight-color blue \
diff-compose-default.pdf
此命令删除
-compose src
部分——结果是 compare
的默认行为,它将 2 个差异图像中的第一个图像保留为亮化背景。 (这次添加了参数以使差异像素显示为蓝色。)
虽然
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 的输出(在我修复了一些错误以使其更好之前):
您可以组合这些方法,使用
compare
查看哪里更改了某些内容,然后使用上面的内容更详细地查看如何更改。
-compose ChangeMask
(另请参阅“删除已知背景” 和以下部分)。
例如,使用 IM7 和这些图像 stone.png
、diamond_ore.png
和 netherrack.png
:magick diamond_ore.png stone.png -fuzz 15% -compose ChangeMask -composite diamond_ore_overlay.png
给出:然后
magick netherrack.png diamond_ore_overlay.png -composite nether_diamond_ore.png
给出:magick netherrack.png \( diamond_ore.png stone.png -fuzz 15% -compose ChangeMask -composite +compose \) -composite nether_diamond_ore.png
)