сопоставление изображений, аффинная деформация - PullRequest
4 голосов
/ 13 июля 2011

Моя проблема показана здесь: постановка задачи . У меня есть один шаблон изображения, который я должен обнаружить на изображении с камеры. После того, как это обнаружено, я должен нормализовать изображение с камеры с помощью аффинного преобразования. Цель моей работы - определить кресты. Я пытался использовать функции SURF для шага нормализации изображения, но шаблонное изображение очень обычное и не подходит для соответствия SURF. Есть идеи, как это можно сделать? Может быть, какое-то совпадение контуров?

Ответы [ 4 ]

5 голосов
/ 13 июля 2011

Итак, я немного подумал об этом, а затем понял, что вы хотите взять ВЕСЬ билет, а не подмножество этого билета и преобразовать его в обычный прямоугольник. Эта проблема (по крайней мере, в теории) не так уж и сложна, и написание некоторого кода для ее самостоятельного выполнения относительно тривиально.

Самая трудная часть этого, безусловно, будет начальным обнаружением угла. Поскольку вас интересует только билет в целом, все на билете ничего не значит. Все, что вас интересует, это четыре угла. Вы можете видеть из своей фотографии, что, когда билет лежит поверх другого билета, угол не очевиден. Если бы все ваши фотографии были билетом, лежащим на очень темной поверхности, то это снова было бы тривиально, но идея состоит в том, чтобы написать приложение, которое, мы надеемся, сможет обрабатывать даже неоднозначные случаи. При этом я бы предложил следующий подход:

1) Используйте фильтры изображения для осветления светлых областей изображения и затемнения темных областей изображения.

Я забыл, как называется этот вид фильтра, но в основном вы хотите иметь больший контраст между темными и светлыми областями изображения.

2) Резкость всех областей выше заданной яркости, гауссово размытие всех областей ниже заданной темноты

Алгоритмы поиска признаков обычно полагаются на «резкость» в изображении, чтобы иметь возможность обнаруживать углы и края. Обостряя все более светлые области изображения (учитывая, что ваш билет белый) и размывая все более темные области изображения, вы увеличиваете свои шансы на алгоритмическое обнаружение искомых углов.

3) Использование функции обнаружения для определения четырех углов

Здесь вещи могут стать волосатыми. Если у вас есть куча лотерейных билетов, которые вы фотографируете, и вы хотите иметь возможность алгоритмически находить один и отображать его без искажений, то вы говорите о передовых в настоящее время исследуемых материалах. Если это то, что вы пытаетесь сделать, то я предлагаю прочитать некоторые из работ Янси Лю, в частности, перцептивную группировку на основе симметрии перевода с приложениями к городским сценам. Скорее всего, вам придется создать шаблон из предварительно созданного изображения заявки, а затем попытаться сопоставить точные характеристики этого шаблона с искаженной сеткой тех же функций в изображении с вашей камеры. Как только у вас есть совпадение, которое превышает процентный порог, вы можете попытаться найти четыре его угла. Если вы найдете их успешно, вы можете перейти к следующему шагу.

ЕСЛИ, с другой стороны, вы не пытаетесь делать самые передовые вещи, тогда вы можете просто сделать некоторые индивидуальные функции обнаружения. Для обнаружения углов я бы рекомендовал использовать алгоритм обнаружения углов Harris & Stephens / Plessey / Shi-Tomasi. Это тот же алгоритм, который Янси использует в ряде своих работ, и он неплохо справляется с обнаружением углов. Я не уверен, принимает ли фильтр серую шкалу изображения или если он принимает текущую цветовую шкалу, но если он делает последний, тогда использование фильтра обнаружения краев Canny перед использованием алгоритма обнаружения углов будет выгодным , Как только вы обнаружите основные углы билета (надеюсь), вам нужно будет разработать какой-то алгоритм интеллектуального поиска (основанный на ракурсе и содержании вашей фотографии), чтобы «угадать», какие углы на самом деле соответствуют четырем углам, которые вас интересуют. .

Стоит также отметить, что «Распространение верования среднего сдвига» может помочь вам в определении наиболее важных функций после алгоритмов обнаружения. В основном вы берете несколько характерных точек в пределах данного блока, усредняете все их координаты, а затем центрируете блок по полученной координате. Если после перемещения в поле появятся новые точки, сделайте это еще раз. Вы продолжаете делать это, пока у вас не будет единственной точки интереса в центре окна. Это краткое описание идеи, поэтому я предлагаю вам изучить ее подробнее, поскольку я не знаю деталей усреднения.

4) Используйте билинейную интерполяцию, чтобы определить цвета, которые необходимо перенести в конечное изображение.

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

Если вы задаете этот вопрос, то я предполагаю, что вы знаете, что означает билинейная интерполяция. Вы могли бы рассмотреть верхний и нижний края искаженного билета, начиная с 0 (левые углы) и заканчивая 1 (правые углы). Вы должны рассмотреть левый и правый края, начиная с 0 (верхние углы) и заканчивая 1 (нижние углы). Вы бы применили эту логику к размерам выходного изображения Идя попиксельно в выходном изображении, вы найдете координаты интерполяции, для которых нужно получить цвет, и, используя билинейную интерполяцию, вы извлечете цвета из входного изображения.

И это все! (смеется) То, что вы просите сделать, довольно сложно, и я желаю вам удачи в этом. Создание алгоритма, который делает это идеально для всех случаев без какого-либо пользовательского ввода, насколько я могу судить, практически невозможно. Также тот факт, что вы смотрите лотерейные билеты, поднимает вопрос, насколько этичен этот проект. В любом случае, надеюсь, этого достаточно, чтобы ваш мозг заработал. Вот несколько дополнительных ссылок:

Обнаружение Canny Edge: http://en.wikipedia.org/wiki/Edge_detection

Обнаружение угла: http://en.wikipedia.org/wiki/Corner_detection

Документы Янси Лю: http://www.cse.psu.edu/~yanxi/

Распространение верования среднего сдвига: используется в статье, о которой я вам говорил

EDIT

Код для разделения уровней

int threshold = 128;
float percentChange = .5;
int oldr, oldg, oldb, newr, newg, newb, grayscale;

//Assuming that pixels is a 1D array of pixel objects that make up the image you're currently working with. Syntax is of Processing.org

for (int i=0; i<pixels.length; i++) {

    oldr = red(pixels[i]);
    oldg = green(pixels[i]);
    oldb = blue(pixels[i]);

    grayscale = Math.floor((oldr + oldg + oldb) / 3.0);

    if (grayScale >= threshold) { //Brightness is above threshold, therefore increase brightness
        newr = oldr + (255-oldr)*percentChange;
        newg = oldg + (255-oldg)*percentChange;
        newb = oldb + (255-oldb)*percentChange;
    } else { //Brightness is below threshold, therefore increase darkness
        newr = oldr - oldr*percentChange;
        newg = oldg - oldg*percentChange;
        newb = oldb - oldb*percentChange;
    }

    pixels[i] = color(newr,newg,newb);

}
0 голосов
/ 08 февраля 2012

Просто найдите самые большие (толстые и длинные) красные линии и сделайте аффинный перекос.

0 голосов
/ 14 июля 2011

Прямые (основанные на пикселях) подходы могут быть лучше в вашем случае, чем основанные на функциях.

Хороший учебник по выравниванию изображений вы можете найти здесь: http://research.microsoft.com/apps/pubs/default.aspx?id=70092

Другая идея заключается в выборе ROI.Если вы знаете, что правильная область на вашем изображении состоит из красных квадратов, вы можете попытаться исключить ее из обнаружения SURF.Кроме того, вы можете определить форму «красного квадрата» и использовать ее для оценки трансформации.

0 голосов
/ 14 июля 2011

В дополнение к ответу MoarCodePlz есть два ключевых слова, которые являются фундаментальными для вашей задачи: решение гомографии и преобразование Хафа .

...