使用ImageMagick"Diff"图像

Jus*_*oel 162 diff image imagemagick image-processing difference

如何获得两个图像之间的差异?我有原始图像.有人写过原始图像的精确副本.现在,我需要比较原始图像和书面图像,并提取图像格式的书写.

示例:我有一张房子的照片.有人拿了一份副本,在副本上写了"你好!".我想以某种方式比较两张照片,删除房子,并留下"Hello!"字样的图像.

ImageMagick有可能吗?我知道有办法获得图像之间的统计差异,但这不是我想要的.

Kur*_*fle 306

我最喜欢的是这两个:

 compare image1 image2 -compose src diff.png
 compare image1 image2 -compose src diff.pdf
Run Code Online (Sandbox Code Playgroud)

上述两个命令之间的唯一区别:第一个显示两个图像之间的视觉差异为PNG文件,第二个显示为PDF.

生成的diff文件显示红色不同的所​​有像素.未改变的那些看起来是白色的.

简短又甜蜜.

请注意,您的图片不一定是同一类型.您甚至可以在一种情况下混合JPEG,TIFF,PNG:图像应该具有相同的大小(图像尺寸,以像素为单位).输出格式由输出文件名的扩展名决定.

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

 compare -density 300 image1 image2 -compose src diff.jpeg
Run Code Online (Sandbox Code Playgroud)

插图示例

以下是对上述命令的变化的结果的一些说明.注意:比较的两个文件甚至是 PDF文件,所以它也适用于这些(只要它们是1页)!


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

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
        diff-compose-default.pdf
Run Code Online (Sandbox Code Playgroud)

这与我上面提到的命令相同.


左:带文本的       图像中心:原始图像       右: "seagreen"像素的差异. 只有Seagreen差异像素;  相同的像素是白色的

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
       -highlight-color seagreen \
        diff-compose-default.pdf
Run Code Online (Sandbox Code Playgroud)

此命令添加一个参数,使差异像素为"seagreen"而不是默认的红色.


左:带文本的       图像中心:原始图像       右:蓝色差异(但是某些上下文背景) 仅蓝色差异像素;  第一个比较的图像作为减轻背景l

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -highlight-color blue \
        diff-compose-default.pdf
Run Code Online (Sandbox Code Playgroud)

此命令将删除该-compose src部分 - 结果是默认行为compare,将2个差异图像中的第一个保留为减轻背景.(这次添加了参数,使差异像素显示为蓝色.)

  • @Krishnom:没有“imagebrick”这样的东西。你是说 ImageMagick 吗? (2认同)
  • @Krishnom:这个问题明确询问了 ImageMagick 解决方案。ImageMagick 的 v6.x 软件套件的一部分有一个单独的 CLI 工具,称为 *`'compare'`*。对于 ImageMagick 的 v7.x,你应该运行 *`'magick compare'`*。 (2认同)

MvG*_*MvG 51

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

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

这个想法是如下:都转换file1.pngfile2.png灰度.然后将第一个作为结果图像的红色通道,第二个作为绿色通道.蓝色通道是由这两个使用darkencompose运算符形成的,这实际上意味着采用最小值.

因此,两个图像中都是白色的东西都是白色的.两张照片中黑色的东西都保持黑色.在第一张图像中是白色但在第二张图中是黑色的东西是红色的东西,在第二张中是白色而在第一个中是黑色的东西是绿色的.

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

在此输入图像描述

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

  • 太好了!我需要一些交互,所以我在Gimp中复制了你的方法.供参考:1)将图像加载为图层,2)颜色 - >去除两个图层的饱和度,3)从"图层"选项卡中的两个图层中删除Alpha通道,4)在一个图层上选择G + B通道,选择全部并清除通道黑色,与第二层上的R + B通道相同,4)在"图层"选项卡中设置上层的屏幕模式. (2认同)