如何获取两张图片之间的差异?我有原始图片。有人在完全复制的原始图像上写了字。现在,我需要比较原始图像和写在图像上的图像,并提取仅包含文字的图像。
例如:我有一张房子的照片。有人复制了它并在复制品上写下“你好!”。我希望以某种方式比较这两张图片,删除房子,并留下一个包含“你好!”字样的图像。
使用ImageMagick能否实现这一点?我知道有方法可以获取图像之间的统计差异,但那不是我想要的。
如何获取两张图片之间的差异?我有原始图片。有人在完全复制的原始图像上写了字。现在,我需要比较原始图像和写在图像上的图像,并提取仅包含文字的图像。
例如:我有一张房子的照片。有人复制了它并在复制品上写下“你好!”。我希望以某种方式比较这两张图片,删除房子,并留下一个包含“你好!”字样的图像。
使用ImageMagick能否实现这一点?我知道有方法可以获取图像之间的统计差异,但那不是我想要的。
我自己的最爱是这两个:
compare image1 image2 -compose src diff.png
compare image1 image2 -compose src diff.pdf
上述两个命令唯一的区别是:第一个命令将两张图片的视觉差异作为PNG文件显示,而第二个命令则作为PDF显示。
生成的差异文件中所有不同像素都以红色显示,未更改的像素以白色显示。
简短明了。
注意,你的图像不需要是相同类型的。甚至可以混合使用JPEG、TIFF、PNG格式——但有一个条件:这些图像应该具有相同的尺寸(以像素为单位)。输出格式由输出文件名的扩展名确定。
如果您因某种原因需要比默认值(72 dpi)更高的分辨率,则只需添加适当的-density
参数即可:
compare -density 300 image1 image2 -compose src diff.jpeg
这里是对以上命令的几个变化结果进行的示例说明。注意:比较的两个文件都是相同的PDF文件,所以它也可以使用在这些文件上(只要它们都是单页)!
左:带有文本的图像 中:原始图像 右:不同之处(=文本)以红色像素表示。
compare \
porsche-with-scratch.pdf porsche-original.pdf \
-compose src \
diff-compose-default.pdf
这是我之前建议的同一条命令。
左侧:带文本的图像 中心:原始图像 右侧:'seagreen'像素的差异。
compare \
porsche-with-scratch.pdf porsche-original.pdf \
-compose src \
-highlight-color seagreen \
diff-compose-default.pdf
此命令添加一个参数,使得不同的像素点“seagreen”而非默认的红色。
左:带文本的图像 中:原始图像 右:蓝色差异(但具有一些背景上下文)。 l
compare \
porsche-with-scratch.pdf porsche-original.pdf \
-highlight-color blue \
diff-compose-default.pdf
这个命令移除了 -compose src
部分 -- 结果是默认行为的 compare
命令,它保留了两个不同图片中第一个作为亮背景的图片。(这次加入了参数以使得不同像素出现蓝色。)
虽然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
合成运算符从这两个文件中形成蓝色通道,该运算符实际上意味着取最小值。compare
查看某个地方的变化,然后使用上述方法更详细地查看其变化方式。-colorspace gray
而不是-grayscale Rec709Luminance
可以解决这个问题,但会破坏图像的构成。将-respect-parentheses
作为convert
的第一个选项添加进去,以解决这个问题。 - Brecht Machiels-compose ChangeMask
(另请参阅"Removing a Known Background"和后续部分)。
例如,使用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
)