使用ImageMagick“Diff”图像

我如何得到两个图像之间的区别?我有原始图像。有人在一模一样的原图上写了字。现在,我需要将原始图像与图像上的文字进行比较,并提取图像格式的文字。

例子:我有一张房子的照片。有人抄了一份,写道:“你好!在副本上。我想以某种方式比较这两张照片,去掉房子,留下一个单词“Hello!”的图像。

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

96896 次浏览

我自己最喜欢的是这两个:

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

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

结果的diff文件以红色显示所有不同的像素。那些没有改变的是白色的。

又短又甜。

注意,你的图像需要不< em > < / em >是相同的类型。你甚至可以混合使用JPEG、TIFF和PNG,但有一个条件:图片的大小必须相同(以像素为单位的图片尺寸)。输出格式由输出文件名的扩展名决定。

如果出于某种原因,你需要一个比默认值(72 dpi)更高的分辨率——那么只需要添加一个适当的-density参数:

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

范例

下面是上述命令变体的一些结果说明。注:比较的两个文件为偶数 < em > PDF文件< / em >,所以它也适用于这些(只要它们是1-pagers)!


左:图像与文本 ,,中心:原始图像;,红色像素的差异(=text)。 Red difference pixels only;相同的像素是白色的

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

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


左:图像与文本 ,中心:原始图片;,“segreen”像素的差异。  segreen difference pixels only;相同的像素是白色的

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

该命令添加了一个参数,使像素差变为“绿色”,而不是默认的红色。


左:图像与文本 ,,中心:原始图像;,,正确的:蓝色差异(但w.一些上下文背景) 蓝色差异像素只有;首先比较的图像作为一个浅色的背景“>l</p>


<pre><code>compare \
porsche-with-scratch.pdf  porsche-original.pdf \
-highlight-color blue \
diff-compose-default.pdf
</code></pre>


<p>这个命令删除了<code>-compose src</code>部分——结果是<code>compare</code>的默认行为,它保留了2张不同图像中的第一张作为浅色背景。(这一次添加了参数,使差异像素显示为蓝色。)</p></div>
                                                                            </div>
                                </div>
                            </div>
                        </div>
                                                <div class=

虽然compare对许多应用程序都做得很好,但我发现有时我更喜欢不同的方法,特别是在比较大多数灰度图像时:

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

其思想如下:将file1.pngfile2.png都转换为灰度。然后将第一个通道作为生成图像的红色通道,第二个通道作为绿色通道。蓝色通道使用darken组合操作符由这两个通道组成,这本质上意味着取最小值。

所以在两幅图像中都是白色的东西仍然是白色的。在两幅图中都是黑色的东西仍然是黑色的。在第一幅图中是白色而在第二幅图中是黑色的东西变成红色,而在第二幅图中是白色而在第一幅图中是黑色的东西变成绿色。

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

enter image description here

你可以将这两种方法结合起来,使用compare来查看在哪里的一些变化,然后使用上面的方法来查看更详细的如何的变化。

在ImageMagick 6.3.4中,您可以使用-compose ChangeMask(也请参阅“移除已知背景”;和以下部分)。 例如,使用IM7和这些映像stone.pngdiamond_ore.pngnetherrack.png:
stone.png .png .  diamd_ore .png .png netherrack.png < / p >

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

magick netherrack.png \( diamond_ore.png stone.png -fuzz 15% -compose ChangeMask -composite +compose \) -composite nether_diamond_ore.png给出:
nether_diamond_ore.png < / p >