【问题标题】:Compare image against an array of images [closed]将图像与图像数组进行比较[关闭]
【发布时间】:2013-12-28 21:53:21
【问题描述】:

我有一张图片位于

C:\ImageOne.png

我可以说目录中有 20 张图片

C:\Images

如何将 ImageOne.png 与所有这些图像进行比较?

例子:

想象一下,我将一张 reCaptcha 图像保存为 C:\ImageOne.png

在位于 C:\Images 的文件夹中,我还有其他 reCaptcha 图像。

然后我需要一个可以在 C:\Images 中找到相同图像的代码

当前代码:

public static bool ImageCompareString(Bitmap firstImage, Bitmap secondImage)
{
    MemoryStream ms = new MemoryStream();
    firstImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    String firstBitmap = Convert.ToBase64String(ms.ToArray());
    ms.Position = 0;

    secondImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    String secondBitmap = Convert.ToBase64String(ms.ToArray());

    if (firstBitmap.Equals(secondBitmap))
    {
        return true;
    }
    else
    {
        return false;
    }
}

Bitmap img2 = new Bitmap(@"C:\ImageOne");

private void CheckCaptcha()
{
    foreach (string s in Directory.GetFiles(@"C:\Images"))
    {
        Bitmap img1 = new Bitmap(s);

        if (ImageCompareString(img1, img2) == true)
        {
            Logging("Identical");
        }
        else
        {
            Logging("Not Identical");
        }
        img1.Dispose();
    }
}

【问题讨论】:

  • 您希望此图像比较有多精确?到每一个比特?或者你需要一些更智能的算法?
  • 您能否更具体地说明您需要什么帮助 - 查找/迭代目录中的文件、读取文件、将文件比较为字节序列/模糊图像比较,甚至可能是 OCR 并比较结果文本?
  • 尽可能好,图片不超过 300x300
  • 假设我有一个 reCaptcha 图像,然后是其他 reCaptcha 图像的文件夹,我需要从该文件夹中找到与第一个相同的图像
  • 为什么需要查找recaptcha 图像?这至少可以说是假的。

标签: c# image-comparison


【解决方案1】:

也许这会有所帮助:

Bitmap img2 = new Bitmap(@"C:\ImageOne.png");
ImageConverter converter = new ImageConverter();
byte[] img2Bytes = (byte[])converter.ConvertTo(img2, typeof(byte[]));

foreach (string s in Directory.GetFiles(@"C:\Images"))
{
    Bitmap img1 = new Bitmap(s);
    byte[] img1Bytes = (byte[])converter.ConvertTo(img1, typeof(byte[]));
    if (CompareImages(img1Bytes,img2Bytes))
    {
        Logging("Identical");
    }
    else
    {
        Logging("Not Identical");
    }
    img1.Dispose();
}

public bool CompareImages(byte[] b1, byte[] b2)
{
   EqualityComparer<byte> comparer = EqualityComparer<byte>.Default;
   if (b1.Length == b2.Length)
   {
       for (int i = 0; i < b1.Length; i++)
       {
           if (!comparer.Equals(b1[i], b2[i])) return false;
       }
    } else { return false; }

     return true;
}

【讨论】:

  • 似乎仍然不起作用,结果不一样,但我知道他们是因为我只是在两个位置粘贴了相同的图像
  • 所有这些仍然返回 Not Identical :/
  • 你确定你的路径是正确的吗?我尝试了两个相同的图像,它工作正常..
  • 我很确定路径是正确的,因为如果不是它会抛出错误。如果文件已经在另一个位图中打开,会导致它失败吗?
  • @Selman22:您的代码一直有效,是另一个位图同时使用该文件导致了问题,非常感谢您的帮助,很抱歉浪费您的时间:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 2016-10-02
  • 2015-11-01
  • 2014-05-15
  • 2015-06-30
  • 2021-04-15
相关资源
最近更新 更多