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)は、安全でないコードを使用して各画像に関連付けられている特定のバイトをチェックするよりもはるかに遅いため、使用しません。

Lockbitsをチェックしてください

于 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");

一致するピクセルを数えることもできますが、それは遅くなります。2つのピクセルの違いを測定することを検討してください。ほとんどの目的で、すべてのピクセルが正確に一致しない可能性がありますが、画像は視覚的に同一に見えます

于 2012-06-23T23:38:16.680 に答える