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

Yuv*_*evy 4 c# imagemagick image-compression

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

例如: 在此处输入图片说明

我正在使用 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());
Run Code Online (Sandbox Code Playgroud)

但是如何使用 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");
Run Code Online (Sandbox Code Playgroud)

奇怪的结果是:当我将以下两个图像与唯一的区别进行比较时: 在此处输入图片说明

这是我得到的结果(而不是上面来自“imageMagick”的例子 在此处输入图片说明

dle*_*tra 5

为此,您将需要使用 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");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

img1.ColorFuzz = new Percentage(5); // adjust this value for your situation
Run Code Online (Sandbox Code Playgroud)

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