Алгоритм обнаружения изображения на другом изображении с некоторым шумом

Я ищу лучшую библиотеку для поиска одинаковой области на двух разных изображениях, все изображения сжаты в JPEG с большим количеством шума. Я с трудом нахожу его. Проблема в том, что если вы увеличите jpeg, вы увидите, что он выглядит как Моне, я имею в виду, что шум содержит цветовую палитру, не имеющую прямой связи с исходным изображением. Поэтому вместо поиска идентичного массива на изображении мне нужно найти «наиболее похожий массив».

Эти изображения взяты из случайного снимка экрана с подобных веб-сайтов googlemap, и изображения не могут быть в другом формате, кроме jpeg.

Я пробовал много ручных способов.

Один из моих методов:

  • Transforming my two images in smaller images
  • Changing them in 4bpp images, or even less colors
  • Taking a small part of image 1
  • Searching for the byte[] array version of a cropped part of image 1 in image 2
  • Not searching for identical, but for similar matches.

    Этот алгоритм работает, но я делаю все в одномерном массиве, и это очень медленно.

    Существуют ли библиотеки, которые выполняли бы этот алгоритм напрямую?

    Мой алгоритм:

        // Where SRC is the bigger image in which I search
        // Offset is where in my small image I start to search
        // Len is how long is my searched array
        // Size is the size of the bigger image in which I'm searching.
        // private Point simpleSearch(byte[] src, int offset, int len, byte[] search, Size size)
        {
            byte[] ddd = new byte[len];
            Array.Copy(search, offset, ddd, 0, len);
            int lowest = 100000000;
            int locmatch = 0;
            for (int i = 0; i < src.Length - len; i++)
            {
                int thed = 0;
                for (int a = 0; a < len; a++)
                {
                    int diff = Math.Abs(src[i + a] - ddd[a]);
                    thed += diff;
                }
    
                thed = thed / len;
                if (thed < lowest)
                {
                    lowest = thed;
                    locmatch = i-len;
                }
            }
    
            int yy = (locmatch / size.Width);
            int xx = locmatch - (yy * size.Width);
            Point p = new Point(xx, yy);
            return p;
        }
    

  • person Léon Pelletier    schedule 27.04.2012    source источник
    comment
    как насчет инвариантности перевода/вращения/масштаба?   -  person moooeeeep    schedule 27.04.2012
    comment
    Извините, я был в моем маленьком пузыре разработчика. Это скриншоты, сделанные случайным образом на карте, похожей на карту Google, поэтому перевод меняется, вращение не меняется, масштаб не меняется.   -  person Léon Pelletier    schedule 27.04.2012
    comment
    Двумерная взаимная корреляция? Я думаю, что это можно даже ускорить с помощью 2-D FFT.   -  person Ben Voigt    schedule 27.04.2012
    comment
    Вау, очень хороший совет. Спасибо. Если вы можете поместить это в качестве ответа, я приму его, так как понимаю, что вы имеете в виду.   -  person Léon Pelletier    schedule 27.04.2012
    comment
    В любом случае, я знаю, что все остальные ответы будут о EmguCV.   -  person Léon Pelletier    schedule 27.04.2012
    comment
    Корреляция, вероятно, будет тем, что вам нужно.   -  person ldog    schedule 27.04.2012


    Ответы (1)


    Да, корреляция или характеристика спектра — это способы определить, насколько похожи две области изображения. Но я думаю, что вам действительно нужен алгоритм для эффективного поиска перекрывающихся областей.

    Проблема соответствия – это четко определенная задача компьютерного зрения, которая пытается выяснить, какие части изображения соответствуют к каким частям другого изображения. Существуют алгоритмы на основе RANSAC.

    Существует также алгоритм квадрированного дерева, который сводит сложность к логарифмическому порядку. .

    person HelloWorld    schedule 27.04.2012
    comment
    Большое спасибо за прямую ссылку на алгоритм. Я думал о чем-то похожем на алгоритм quad-tree. Вы начинаете с очень маленького изображения, затем на каждом этапе увеличиваете более похожее изображение. С вашим ответом я должен сделать что-то, что работает. - person Léon Pelletier; 28.04.2012