ChatGPT解决这个技术问题 Extra ChatGPT

使用 ImageMagick “区分”图像

我怎样才能得到两个图像之间的差异?我有原图。有人在原始图像的精确副本上写了字。现在,我需要将原始图像与写在图像上的内容进行比较,并仅提取图像格式的文字。

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

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

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

K
Kurt Pfeifle

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

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

https://i.stack.imgur.com/8ZUXl.png

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

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

https://i.stack.imgur.com/Udvz4.png

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

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

https://i.stack.imgur.com/bunXr.png

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

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


我无法理解这个比较 cli 的来源?它是imagebrick的一部分吗?可以在 Windows 上使用吗?
@Krishnom:没有“imagebrick”这样的东西。你是说ImageMagick吗?
@Krishnom:这个问题明确询问了 ImageMagick 解决方案。 ImageMagick 的 v6.x 软件套件的一部分有一个名为 'compare' 的单独 CLI 工具。对于 ImageMagick v7.x,您应该运行 'magick compare'
我的错。感谢您纠正(imagebrick -> imageMagick)。我会试一试。我也在寻找比较批量图像的工具。再次感谢您的帮助
@Krishnom:我不知道什么是“批量图像”。但我仍然敢打赌,ImageMagick 工具套件可以满足您的需求。
B
Brecht Machiels

虽然 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 的输出(在我 fixed some bug 之前使这更好):

https://i.stack.imgur.com/jV4ut.png

您可以结合这些方法,使用 compare 查看 where 发生了什么变化,然后使用上述方法更详细地查看它如何 发生了变化。


好的!我需要一些互动,所以我在 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