【问题标题】:“Diff” an image using ImageMagick使用 ImageMagick “区分”图像
【发布时间】:2011-07-05 04:50:28
【问题描述】:

如何区分两张图片?我有原图。有人在原始图像的精确副本上写了字。现在,我需要将原始图像与写在图像上的内容进行比较,并仅提取图像格式的文字。

示例:我有一张房子的照片。有人拿了一份并写了“你好!”副本上。我想以某种方式比较这两张图片,移除房子,然后留下一张带有“你好!”字样的图片。

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

【问题讨论】:

  • 试试 ImageMagick 使用指南的this section
  • 我知道这个问题是关于 ImageMagick 的,但我只需要包含一个指向 Resemble.js 的链接,供可能寻求不可知解决方案的“因果”搜索者使用。
  • 有谁知道一种工具,可以通过从第一张图像中减去第二张图像的像素来比较两张图像?我不想自己写。
  • Imagemagick 7 具有感知散列,这是一种使用不变图像矩的技术。从某种意义上说,即使在旋转、桶形失真、调整大小、伽马变化、噪声引入、水印之后,它的哈希值也相同,这很好。
  • @v.oddou,谢谢。我阅读了文档并进行了更多测试。对于人口稀少且像素密度极低的线条图,它似乎表现不佳。看起来像素密度是 PHASH 识别相似性的关键。

标签: image image-processing imagemagick diff difference


【解决方案1】:

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

 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 文件,所以它也适用于这些文件(只要它们是一页纸)!


左: 带有文字的图像     中心: 原始图像     右: 红色像素的差异(=文本)。

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

此命令添加了一个参数以使差异像素为“海绿色”而不是默认的红色。


左: 带有文字的图像     中心: 原始图像     右: 蓝色差异(但带有一些上下文背景) l

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

此命令删除了-compose src 部分——结果是compare 的默认行为,它将两个不同图像中的第一个保持为浅色背景。 (这次添加了参数,使差异像素显示为蓝色。)

【讨论】:

  • 我无法理解这个比较 cli 的来源?它是imagebrick的一部分吗?在 Windows 上可用吗?
  • @Krishnom:没有“imagebrick”这样的东西。你是说 ImageMagick 吗?
  • @Krishnom:这个问题明确地询问了 ImageMagick 解决方案。 ImageMagick 的 v6.x 软件套件的一部分有一个名为 'compare' 的单独 CLI 工具。对于 ImageMagick v7.x,您应该运行 'magick compare'
  • 我的错。感谢您纠正(imagebrick -> imageMagick)。我会试一试。我也在寻找比较批量图像的工具。再次感谢您的帮助
  • @Krishnom:我不知道什么是“批量图像”。但我仍然敢打赌,ImageMagick 工具套件可以满足您的需求。
【解决方案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.pngfile2.png都转换为灰度。然后将第一个作为结果图像的红色通道,第二个作为绿色通道。蓝色通道是使用darken compose 运算符由这两个组成的,这实际上意味着取最小值。

因此,两个图像中的白色物体都保持白色。两个图像中黑色的东西都保持黑色。第一张图片是白色但第二张图片是黑色的东西变成红色,第二张图片是白色但第一张图片是黑色的东西变成绿色。

结果为您提供了一个很好的颜色编码图像,您可以轻松地将绿色与第一个输入相关联,将红色与第二个输入相关联。这是一个示例,我使用它来比较 LaTeX 的输出与 KaTeX 的输出(在我 fixed some bug 之前使这更好):

您可以结合这些方法,使用compare 来查看在哪里发生了变化,然后使用上面的方法更详细地查看如何发生了变化。

【讨论】:

  • 不错!我需要一些互动,所以我在 Gimp 中复制了你的方法。供参考:1)将图像加载为图层,2)颜色->对两个图层进行去饱和处理,3)在“图层”选项卡中从两个图层中删除 Alpha 通道,4)在一个图层上选择 G + B 通道,全选并清除通道黑色,与第二层的R + B通道相同,4)在“图层”选项卡中为上层设置屏幕模式。
  • @Palmstrom:谢谢!我最初使用 Gimp 自己进行了这些图像比较,但我直接在输入图像上使用 the “grain extract” layer mode 这样做,所以公共区域最终会变成灰色,而差异在一个方向上是黑色,在另一个方向上是白色。更难阅读,但生成速度更快,并且它可以包含颜色信息。如果您使用“仅变暗”而不是“屏幕”并将未使用的通道着色为白色而不是黑色,我想您会更接近地匹配我的命令。
  • 一些 PDF输入由于某种原因在灰度转换后导致图像反转。使用-colorspace gray 而不是-grayscale Rec709Luminance 可以解决这个问题,但这会打乱组合。将-respect-parentheses 添加为convert 的第一个选项以解决此问题。
  • 这是一个使用此方法逐页直观地比较两个 PDF 的脚本:gist.github.com/brechtm/891de9f72516c1b2cbc1。它为pdfdiff 目录中的 PDF 的每一页输出一个 JPG,并另外打印两个 PDF 之间不同的页数。
  • 在 ImageMagick v6.7.7-10 中似乎不支持 -grayscale,我不得不按照 @BrechtMachiels 的建议使用 -colorspace gray
猜你喜欢
  • 2012-01-06
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 2014-01-25
  • 1970-01-01
  • 2010-09-17
  • 2021-04-18
相关资源
最近更新 更多