2

我想将 2 幅图像的相似度与百分比进行比较。我想检测 90% 相同的图像。每个图像大小为 16x16 像素。我需要一些线索,帮助它。现在,与下面的代码进行比较时,我能够检测到 100% 相同的图像

for (; x < irMainX; x++)
{

    for (; y < irMainY; y++)
    {
        Color pixelColor = image.GetPixel(x, y);
        if (pixelColor.A.ToString() != srClickedArray[x % 16, y % 16, 0])
        {
            blSame = false;
            y = 16;
            break;
        }
        if (pixelColor.R.ToString() != srClickedArray[x % 16, y % 16, 1])
        {
            blSame = false;
            y = 16;
            break;
        }
        if (pixelColor.G.ToString() != srClickedArray[x % 16, y % 16, 2])
        {
            blSame = false;
            y = 16;
            break;
        }
        if (pixelColor.B.ToString() != srClickedArray[x % 16, y % 16, 3])
        {
            blSame = false;
            y = 16;
            break;
        }
    }

    y = y - 16;

    if (blSame == false)
        break;
}

例如,我想将这 2 个图像识别为相同的。目前该软件将它们识别为不同的图像,因为它们并不完全相同

在此处输入图像描述 在此处输入图像描述

4

2 回答 2

2

我不会使用 image.GetPixel(x,y),因为它比使用不安全代码检查与每个图像关联的特定字节要慢得多。

查看锁位

于 2012-06-24T02:50:02.127 回答
2

对不匹配的像素数使用计数:

public const double PERCENT_MATCH = 0.9;

int noMatchCount = 0;
for (int x = 0; x < irMainX; x++)
{
    for (int y = 0; y < irMainY; y++)
    {
       if ( !pixelsMatch( image.GetPixel(x,y), srClickedArray[x%16, y%16] )
       {
           noMatchCount++;
           if ( noMatchCount > ( 16 * 16 * ( 1.0 - PERCENT_MATCH ))
              goto matchFailed;
       }
    }
}
Console.WriteLine("images are >=90% identical");
return;
matchFailed:
Console.WriteLine("image are <90% identical");

您可以计算匹配像素,但这会更慢。考虑测量两个像素相差多少。对于大多数目的 - 您可以让所有像素不完全匹配 - 但让图像看起来在视觉上相同

于 2012-06-23T23:38:16.680 回答