【问题标题】:Comparing two images using ImageMagick and C#使用 ImageMagick 和 C# 比较两个图像
【发布时间】:2017-03-14 15:25:05
【问题描述】:

我想比较两张图片,然后生成并保存一张图片,该图片将显示已发现的所有差异,

例如:

我正在使用 ImageMagick:https://magick.codeplex.com/ 但是他们没有完整的 C# 文档。 我只找到:http://www.imagemagick.org/Usage/compare/

此代码例如显示从 0 到 1 的值,表示图片的相似程度:

    MagickImage img1 = new MagickImage(@"C:\test\Image1.jpg");
    MagickImage img2 = new MagickImage(@"C:\test\Image2.jpg");
    double diff =  img1.Compare(img2,new ErrorMetric());

但是如何使用 ImageMagick 比较图像,然后保存如上例及其网站中所示的结果?

更新: 在 dlemstra 的帮助下,我编写了以下代码,并生成了图像,这些图像可以显示上面示例中的差异。 MagickImage img1 = new MagickImage(@"C:\test\Image1.jpg"); MagickImage img2 = new MagickImage(@"C:\test\Image2.jpg"); MagickImage img3 = new MagickImage(@"C:\test\Image3.jpg"); MagickImage img4 = new MagickImage(@"C:\test\DiffImage.jpg"); MagickImage img5 = new MagickImage(@"C:\test\DiffImage.jpg");

        var imgDiff = new MagickImage();

        img1.Compare(img2, new ErrorMetric(), imgDiff);
        imgDiff.Write(@"C:\test\Diff4.jpg");

        img1.Compare(img3, new ErrorMetric(), imgDiff);
        imgDiff.Write(@"C:\test\Diff5.jpg");

        img1.Compare(img4, new ErrorMetric(), imgDiff);
        imgDiff.Write(@"C:\test\Diff6.jpg");

        img5.Compare(img4, new ErrorMetric(), imgDiff);
        imgDiff.Write(@"C:\test\Diff7.jpg");

奇怪的结果是:当我将以下两张图像与唯一标记的差异进行比较时:

这是我得到的结果(而不是上面的“imageMagick”示例

【问题讨论】:

  • 嗨 @Yuval 你有没有找到解决这个问题的办法?

标签: c# imagemagick image-compression


【解决方案1】:

为此,您需要使用 Compare 方法的其他重载之一。下面的示例演示了如何执行此操作:

using (var img1 = new MagickImage(@"C:\test\Image1.jpg"))
{
  using (var img2 = new MagickImage(@"C:\test\Image2.jpg"))
  {
    using (var imgDiff = new MagickImage())
    {
      double diff = img1.Compare(img2, new ErrorMetric(), imgDiff);
      imgDiff.Write(@"C:\test\Diff-Image1-Image2.jpg");
    }
  }
}

但是当您使用 jpeg 图像(它们是有损的)时,您可能还想在第一张图像上设置 ColorFuzz:

img1.ColorFuzz = new Percentage(5); // adjust this value for your situation

这将使几乎相同的像素也匹配。

【讨论】:

  • 谢谢!这很有帮助,但是现在当我进行两个比较时:一个具有完全相同的图像,然后几乎没有区别,我得到了奇怪的结果...请查看更新的问题
【解决方案2】:

经验教训:

想添加一些重要的注释,以便其他人避免我在第一次测试 ImageMagick(或任何比较工具)时遇到的陷阱。

  1. 一般要注意在 Windows Paint 中进行编辑。
  2. 不要在 Windows 绘图中编辑具有透明背景的 *.png 并期望得到很好的比较。 Windows Paint 不处理透明背景,您在 Paint 中编辑的 png 现在将具有白色背景。图像在肉眼看来完全一样,但图像比较者更清楚。
  3. 如果您有 SnagIt,当您想测试图像比较工具时,这是一个更好的工具来编辑图像。

结论

@dlemstra 编写的代码确实按预期工作。只需确保在第一次测试时第二张图像(您修改过的)没有被您使用的图像编辑器无意修改。这是第一次测试任何图像比较工具以查看是否要使用它时的一般警告。

示例

示例 1:透明 png + Windows Paint

下载透明图像,在 Paint 中对其进行制作和编辑,无意中也会将背景更改为白色而不是透明。 只需打开,然后将第二张图像保存在 Paint 中而不对图像进行任何编辑,就会导致差异看起来像这样:

在与 Beyond Compare 进行比较之前,我无法弄清楚发生了什么:

示例 2:复杂的 *.jpg + Windows Paint

Windows Paint 也不擅长在保存之间保持复杂图像相同: 大红色区域是我所做的更改,但玫瑰的细轮廓是 Windows Paint 对图片所做的更改

即使我根本没有做任何更改,只是在 Paint 中打开、保存和关闭第二张图像(原始图像是也保存在 Paint 中的图像),Paint 仍然对图片进行了不希望的编辑(黑暗图片中的红点):

然后我有一个原始图像,它保存在 Paint 中并复制了这个图像,在 snagIt 中打开第二个图像,在 snagit 中保存第二个图像,然后关闭图像并比较两个图像(应该是相同的)。然而,snagIt 似乎对原始的“Paint saved”图像进行了自己的修改:

最后,我复制了“已保存的 Snagit”图像,也在 SnagIt 中打开了第二张图像,对第二张图像进行了编辑,将图像保存在 SnagIt 中,然后关闭了图像。 SnagIt 没有对此图像进行任何修改,比较结果完全符合我的预期:

最后: 您找到的有关 ImageMagick 的大多数信息都与通过命令行使用它有关。您可以通过 NuGet 包管理器将 Magick.Net nuget 添加到 Visual Studio 中的 C# 项目

【讨论】:

    猜你喜欢
    • 2013-12-30
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 2019-07-07
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多