获得最相似的图像

时间:2017-11-08 17:55:43

标签: c# bitmap image-comparison

我有一个Bitmap A和一个Bitmap数组,在数组中有一个看起来与Bitmap A相同的Bitmap。我使用下面的代码,但它有时不起作用,它迭代整个数组而不用找到它,似乎有一些细微的差别,有没有办法改变函数返回true如果它的90%相似或选择阵列中最相似的图像?该阵列只有6张图片。

 for(int i = 0; i < list.Count;i++)
    {
        if(ImageCompareString(image,list[i])
        {
            answerIndex = i;
            break;
        }
    }

private 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;
    }
}

1 个答案:

答案 0 :(得分:0)

当然有这样的方式......但你必须自己编码。

首先你不应该比较base64数据......你将失去直接的像素值访问权限,并将数据的大小增加到150%以上(原价200%但更正了谢谢由于UTF16,在C#中对PeterDuniho的评论 第二我假设所有图片都具有相同的固定大小。在比较之前,将图像尺寸缩小到非常小的尺寸,但保持宽度/高度方面。这将加速比较并消除噪音 第三次迭代两张图片并比较他们的灰度像素值。我假设您已将图片大小调整为16x16。由于我们正在比较它们的灰度值,因此一个像素的介于0到255之间。因此两个图像之间的最大距离为16 * 16 * 256 = 65536。如果两张照片都是黑色,则照片之间的距离将为零(100%相似度)。如果一张图片是黑色而另一张图片是白色,则距离将为65535(相似度为0%)。

比较图像迭代图片像素,并从点grayscale-pixel-value-from-picture-a的{​​{1}}减去grayscale-pixel-value-of-picture-b,并将绝对差值添加到计数器。此计数器将是两张图片之间的总距离。 让我们假设这个计数器在比较循环后的值为1000,你得到两个图片之间的x,y ~1.5%差异(或98.5%相似度)的百分比相似度。

伪 - 比较 - 代码

1000 / 65535

这是一种或多或少的简单方法,但您必须使用方案/图像进行测试。您也可以比较rgb值,而不是比较灰度值。寻找距离定义,如欧几里德距离...开始并继续阅读:)

EDIT
这只是一个非常基本的方法,可以解释如何开始比较图像。它没有考虑到可能有不同的图像格式(jpeg,png,gif),颜色格式(索引,16位,24位,32位)或具有不同分辨率的图像。