Сравнение растровых изображений с разницей в пикселях - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть образец изображения размером 60x60, и я пытаюсь найти этот образец на увеличенном снимке экрана (размером 1920x1080).

Моя проблема в том, что хотя образец виден на скриншоте и помещен правильно, я не могу его обнаружить из-за незначительных цветовых различий. Как видно из приведенного ниже кода, пиксели не равны, но они действительно близки по цвету (около 0,10 в разнице оттенков). В этом случае между этими двумя значениями должно быть различие в качестве, поскольку оба растровых изображения имеют одинаковый формат Format32bppArgb.

Метод, который я использую для захвата экрана:

private static Bitmap Screenshot(int x, int y, int width, int height)
{
    var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);

    using (var g = Graphics.FromImage(bmp))
    {
        g.CopyFromScreen(x, y, 0, 0, bmp.Size);
        return bmp;
    }
}

Вот как я делаю сравнения:

private static void Main(string[] args)
{
    // Load a sample
    var sample = (Bitmap)Image.FromFile("sample.png");

    // Capture screen frame
    var screenshot = Screenshot(0, 0, 1920, 1080);

    // Get first pixel in a sample
    var firstPixel = sample.GetPixel(0, 0);

    // Get same pixel in the screenshot
    // sample position first pixel is at 1590x500
    var targetPixel = screenshot.GetPixel(1590, 500);

    // Compare pixels
    var equal = firstPixel.ToArgb() == targetPixel.ToArgb(); // This fails!

    // Get hue levels
    var sourcePixHue = firstPixel.GetHue();
    var targetPixHue = targetPixel.GetHue();

    // Result: a tiny difference
    // sourcePixHue = 12.3076925
    // targetPixHue = 12.4137926
}

Мои вопросы:

  • Какова лучшая практика, формат изображения для сравнения двух растровых пикселей, чтобы они были равны?
  • Как правильно подготовить образец растрового изображения, чтобы "преодолеть" разницу в качестве / цвете с растровым изображением на скриншоте?
...