WedX - журнал о программировании и компьютерных науках

сопоставление изображений, аффинная деформация

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


  • Сколько ручного ввода может разрешить ваша программа, или ввод вообще не разрешен? 13.07.2011
  • ручной ввод невозможен, все должен делать компьютер. 13.07.2011
  • И вы хотите написать все это с нуля или использовать существующую библиотеку, которая сделает всю работу за вас? 13.07.2011
  • я не против! просто нужны некоторые подсказки, как это можно сделать! в тот момент я пробовал кое-что с OpenCv.. 13.07.2011
  • Разместите, пожалуйста, две четкие фотографии с хорошим разрешением шаблона и искаженные изображения без наложенного текста. Спасибо! 19.07.2011

Ответы:


1

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

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

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

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

2) Повышение резкости всех областей выше заданной яркости, размытие по Гауссу всех областей ниже заданной темноты.

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

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

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

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

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

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

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

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

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

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

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

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

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

ИЗМЕНИТЬ

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

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

}
13.07.2011
  • спасибо за эти подсказки! я искал несколько фильтров для 1.) но никого не нашел .. вы можете вспомнить название этих фильтров? 13.07.2011
  • Добавлен код для фильтра. Не удалось найти его название (я думаю, что оно слишком общее), но реализация есть. Вы в основном перебираете пиксели, проверяете яркость (оттенки серого), и если она выше порогового значения, вы увеличиваете каждый цветовой канал на % расстояния между текущим значением и 255. Если оно ниже, вы уменьшаете значение на % от расстояние между 0 и текущим значением. 13.07.2011

  • 2

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

    13.07.2011

    3

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

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

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

    14.07.2011
  • я уже пытался использовать ROI, но у меня возникли проблемы, если в правой верхней области ничего нет... но вы правы, может быть, если я обнаружу квадраты и дополнительно использую эти точки, это может сработать... какой алгоритм вам подойдет использовать для обнаружения красных квадратов? 15.07.2011
  • Прежде всего, я бы попробовал что-нибудь простое, нашел длинные красные линии (например, с помощью преобразования hough) и определил их ориентацию. Выберите два самых популярных направления и поверните на правильный угол. Вторая идея состоит в том, чтобы использовать что-то вроде сопоставления шаблонов Edge: codeproject.com/KB/graphics/Edge_Based_template_match .aspx и используйте длинные красные линии на изображении шаблона в качестве шаблона для алгоритма. 16.07.2011

  • 4

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

    08.02.2012
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]