比较2个16x16像素图像的相似度

时间:2012-06-23 23:28:01

标签: c# image-processing comparison pixel similarity

我想将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;
}

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

enter image description here enter image description here

2 个答案:

答案 0 :(得分: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");

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

答案 1 :(得分:2)

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

查看Lockbits