使用ImageMagick“区分”图像


178

如何获得两个图像之间的差异?我有原始图像。有人在原始图像的精确副本上写过字。现在,我需要将原始图像与图像上的文字进行比较,并仅提取图像格式的文字。

例子:我有一张房子的照片。有人抄袭并写下“你好!” 在副本上。我想以某种方式比较这两张图片,移走房子,然后留下“ Hello!”字样的图片。

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


8
试试ImageMagick使用指南的这一部分
Benoit

1
我知道这个问题是关于ImageMagick的,但是我只需要为“可能的”搜索者提供一个指向Resemble.js的链接,该搜索者可能会寻求一个不可知的解决方案。
brichins

有谁知道一种通过从第一张图像减去第二张图像的像素来比较两张图像的工具?我宁愿不自己写。
MarcusJ 2015年

Imagemagick 7具有感知哈希,这是一种使用不变图像矩的技术。从某种意义上说,即使在旋转,桶变形,调整大小,伽玛变化,引入噪声,加水印之后,它也保持相同的哈希值
v.oddou

1
@ v.oddou,谢谢。我阅读了文档,并做了一些其他测试。线条非常稀疏且像素密度极低的线条图似乎表现不佳。看起来像素密度是PHASH识别相似性的关键。
布雷迪

Answers:


320

我自己的最爱是以下两个:

 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文件,因此它也适用于这些文件(只要它们是1页)!


左:带有文本的       图像中心:原始图像       右:红色像素之间的差异(=文本)。 仅红色差异像素; 相同的像素是白色的

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,将2张衍射图像中的第一个图像保留为浅色背景。(这次添加了参数,以使差异像素显示为蓝色。)


我无法理解此比较cli的来源?它是imagebrick的一部分吗?在Windows上可用?
克里希诺'19

2
@Krishnom:没有“ imagebrick”之类的东西。您是说ImageMagick吗?
库尔特·菲佛

2
@Krishnom:这个问题明确询问了有关ImageMagick解决方案的问题。ImageMagick的v6.x软件套件的一部分有一个单独的CLI工具,称为'compare'。对于ImageMagick的v7.x,应'magick compare'改为运行。
Kurt Pfeifle,

我的错。感谢您纠正此错误(imagebrick-> imageMagick)。我会试试看。我也在寻找比较批量图像的工具。再次感谢您的帮助
克里希诺

@Krishnom:我不知道什么是“批量图像”。但是我仍然打赌,ImageMagick工具套件可以完成您想要的事情。
Kurt Pfeifle

53

虽然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为灰度。然后将第一个作为生成图像的红色通道,第二个作为绿色通道。蓝色通道是使用darkencompose运算符从这两个通道形成的,从本质上讲,这意味着采用最小的通道。

因此,两个图像中都是白色的东西保持白色。在两个图像中都是黑色的东西保持黑色。在第一个图像中为白色但在第二个图像中为黑色的事物变为红色,在第二个图像中为白色但在第一图像中为黑色的事物变为绿色。

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

在此处输入图片说明

您可以结合的方法,用compare哪里的东西改变了,然后用上面更详细地看怎么它改变。


2
真好!我需要一些交互,所以我在Gimp中复制了您的方法。供参考:1)将图像加载为图层,2)颜色->降低两个图层的饱和度,3)在“图层”选项卡中从两个图层中删除alpha通道,4)在一层上选择G + B通道,选择全部并清除通道黑色,与第二层的R + B通道相同,4)在“层”选项卡中为上层设置“屏幕”模式。
马捷SMID

1
@Palmstrom:谢谢!我最初是使用Gimp自己进行这些图像比较的,但是我是直接在输入图像上使用“纹理提取”图层模式进行的,因此公共区域最终将变成灰色,而差异将在一个方向上变成黑色,而在另一个方向上变成白色。 。较难阅读,但生成速度更快,并且可以包含颜色信息。我想如果您使用“仅暗”而不是“屏幕”,并且将未使用的通道颜色改为白色而不是黑色,则您将更加匹配我的命令。
MvG

1
由于某些原因,某些 PDF输入会在灰度转换后导致图像反转。使用-colorspace gray而不是-grayscale Rec709Luminance修复该问题,但这会使结构混乱。添加-respect-parentheses为第一个选择来convert解决这个问题。
Brecht Machiels '16

这是一个使用此方法逐页可视地差异化两个PDF的脚本:gist.github.com/brechtm/891de9f72516c1b2cbc1。它为pdfdiff目录中PDF的每一页输出一个JPG,并另外打印两个PDF之间不同的页数。
Brecht Machiels '16

1
在ImageMagick v6.7.7-10中似乎-grayscale不受支持,我不得不-colorspace gray按照@BrechtMachiels的建议使用
奥斯汀马
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.