使用ImageMagick和C#比较两个图像

时间:2016-11-01 13:20:19

标签: c# imagemagick image-compression

我想比较两个图像然后生成并保存一个图像,该图像将显示已找到的所有差异,

例如: enter image description here

我正在使用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 =新的MagickImage(@" C:\ test \ Image1.jpg");             MagickImage img2 =新的MagickImage(@" C:\ test \ Image2.jpg");             MagickImage img3 =新的MagickImage(@" C:\ test \ Image3.jpg");             MagickImage img4 =新的MagickImage(@" C:\ test \ DiffImage.jpg");             MagickImage img5 =新的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");

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

这是我得到的结果(而不是上面的例子来自" imageMagick" enter image description here

2 个答案:

答案 0 :(得分:2)

为此,您需要使用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

这样可以使几乎相同的像素也匹配。

答案 1 :(得分:0)

经验教训:

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

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

结论

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

示例

示例 1:透明 png + Windows 画图

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

enter image description here

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

enter image description here

示例 2:复杂 *.jpg + Windows 画图

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here