我怎样才能得到两个图像之间的差异?我有原图。有人在原始图像的精确副本上写了字。现在,我需要将原始图像与写在图像上的内容进行比较,并仅提取图像格式的文字。
示例:我有一张房子的照片。有人拿了一份并写了“你好!”副本上。我想以某种方式比较这两张照片,移除房子,然后留下一张带有“你好!”字样的图像。
ImageMagick 可以做到这一点吗?我知道有一些方法可以获得图像之间的统计差异,但这不是我想要的。
我自己最喜欢的是这两个:
compare image1 image2 -compose src diff.png
compare image1 image2 -compose src diff.pdf
上述 2 个命令之间的唯一区别:第一个命令将两个图像之间的视觉差异显示为 PNG 文件,第二个命令显示为 PDF。
生成的差异文件显示所有红色不同的像素。未更改的显示为白色。
短而甜。
请注意,您的图像不必是同一类型。您甚至可以混合使用 JPEG、TIFF、PNG - 在一种情况下:图像应该具有相同的大小(图像尺寸以像素为单位)。输出格式由输出文件名的扩展名决定。
如果您出于某种原因需要比默认分辨率 (72 dpi) 更高的分辨率,那么只需添加适当的 -density
参数:
compare -density 300 image1 image2 -compose src diff.jpeg
插图示例
以下是上述命令变体的一些结果说明。注意:比较的两个文件甚至是 PDF 文件,所以它也适用于这些文件(只要它们是 1 页)!
https://i.stack.imgur.com/8ZUXl.png
compare \
porsche-with-scratch.pdf porsche-original.pdf \
-compose src \
diff-compose-default.pdf
这与我之前建议的命令相同。
https://i.stack.imgur.com/Udvz4.png
compare \
porsche-with-scratch.pdf porsche-original.pdf \
-compose src \
-highlight-color seagreen \
diff-compose-default.pdf
此命令添加一个参数以使差异像素为“海绿色”,而不是默认的红色。
https://i.stack.imgur.com/bunXr.png
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 的输出(在我 fixed some bug 之前使这更好):
https://i.stack.imgur.com/jV4ut.png
您可以结合这些方法,使用 compare
查看 where 发生了什么变化,然后使用上述方法更详细地查看它如何 发生了变化。
-colorspace gray
而不是 -grayscale Rec709Luminance
可以解决这个问题,但这会打乱组合。将 -respect-parentheses
作为第一个选项添加到 convert
以解决此问题。
pdfdiff
目录中的 PDF 的每一页输出一个 JPG,并另外打印两个 PDF 之间不同的页数。
-grayscale
,我不得不按照@BrechtMachiels 的建议使用 -colorspace gray
'compare'
的单独 CLI 工具。对于 ImageMagick v7.x,您应该运行'magick compare'
。