Распознавание образов для сравнения изображений в .net - PullRequest
1 голос
/ 14 мая 2010

Кто-нибудь может поделиться кодом или алгоритмом (используя распознавание образов) для сравнения изображений в .net.

Мне нужно сравнить 2 изображения разного разрешения и текстуры и найти разницу. Теперь у меня есть код, чтобы найти разницу между 2 изображениями, используя C #

// Load the images.
Bitmap bm1 =  (Bitmap) (Image.FromFile(txtFile1.Text));
Bitmap bm2 =  (Bitmap) (Image.FromFile(txtFile2.Text));

// Make a difference image.
int wid = Math.Min(bm1.Width, bm2.Width);
int hgt = Math.Min(bm1.Height, bm2.Height);
Bitmap bm3 = new Bitmap(wid, hgt);

// Create the difference image.
bool are_identical = true;
int r1;
int g1;
int b1;
int r2;
int g2;
int b2;
int r3;
int g3;
int b3;
Color eq_color = Color.Transparent;
Color ne_color = Color.Transparent;
for (int x = 0; x <= wid - 1; x++)
{
    for (int y = 0; y <= hgt - 1; y++)
    {
        if (bm1.GetPixel(x, y).Equals(bm2.GetPixel(x, y)))
        {
            bm3.SetPixel(x, y, eq_color);
        }
        else
        {
            bm1.SetPixel(x, y, ne_color);
            are_identical = false;
        }
    }
}

// Display the result.
picResult.Image = bm1;

    Bitmap Logo = new Bitmap(picResult.Image);
    Logo.MakeTransparent(Logo.GetPixel(1, 1));
    picResult.Image = (Image)Logo;

//this.Cursor = Cursors.Default;
if ((bm1.Width != bm2.Width) || (bm1.Height != bm2.Height))
{
    are_identical = false;
}
if (are_identical)
{
    MessageBox.Show("The images are identical");
}
else
{
    MessageBox.Show("The images are different");
}

//bm1.Dispose()
// bm2.Dispose()

НО это сравнение, если 2 изображения имеют одинаковое разрешение и размер. Если на одном изображении присутствует какая-то тень (но 2 изображения одинаковы), это показывает разницу между изображениями ... поэтому я пытаюсь сравнить, используя шаблон признание.

Ответы [ 2 ]

0 голосов
/ 14 мая 2010

Ваш запрос - действительно сложная научная (даже инженерная) задача. Основной очевидный алгоритм заключается в следующем:

  1. Каким-то образом выделите все объекты на обоих сравниваемых изображениях. Эта часть относительно проста и может быть решена многими способами.

  2. Сравните все объекты. Эта часть является задачей для ученых, учитывая тот факт, что их можно перемещать, поворачивать, изменять размер и так далее. :) Тем не менее, это может быть решено в случае, если у вас есть определенное количество объектов для распознавания. Как "круг", "треугольник", "прямоугольник", "линия".

0 голосов
/ 14 мая 2010

Как сказал nailxx, нет "100% работающего свободного кода" или чего-то подобного. Несколько лет назад я помогал реализовать приложение «распознавания лиц», и одна из вещей, которые мы использовали, была «Двоичные шаблоны локалей». Это не слишком легко, но это дало довольно хорошие результаты. Найдите статью об этом здесь: Локальные двоичные структуры

Редактировать: Боюсь, я не могу найти бумагу, которую я использовал в эти дни, она была короче и зафиксирована на самом LBP, а не как использовать ее с текстурами.

...