Моя проблема показана здесь: постановка проблемы. У меня есть одно шаблонное изображение, которое я должен обнаружить на изображении с камеры. После его обнаружения я должен нормализовать изображение с камеры с помощью аффинного преобразования. Цель моей работы - выявление крестов. Я попытался использовать функции SURF для этапа нормализации изображения, но изображение шаблона очень регулярное и не подходит для сопоставления SURF. Любые идеи, как это можно сделать? Может быть, какое-то совпадение контуров?
сопоставление изображений, аффинная деформация
- Сколько ручного ввода может разрешить ваша программа, или ввод вообще не разрешен? 13.07.2011
- ручной ввод невозможен, все должен делать компьютер. 13.07.2011
- И вы хотите написать все это с нуля или использовать существующую библиотеку, которая сделает всю работу за вас? 13.07.2011
- я не против! просто нужны некоторые подсказки, как это можно сделать! в тот момент я пробовал кое-что с OpenCv.. 13.07.2011
- Разместите, пожалуйста, две четкие фотографии с хорошим разрешением шаблона и искаженные изображения без наложенного текста. Спасибо! 19.07.2011
Ответы:
Итак, я подумал об этом, а затем понял, что вы хотите взять ВЕСЬ билет вместо подмножества этого билета и преобразовать его в обычный прямоугольник. Эта проблема (по крайней мере, в теории) не так уж сложна, и написать код, чтобы решить ее самостоятельно, относительно тривиально.
Самая сложная часть этого, безусловно, будет начальное обнаружение угла. Поскольку вас интересует только билет в целом, все в билете ничего не значит. Все, что вас интересует, это четыре угла. На вашей картинке видно, что, когда билет лежит поверх другого билета, угол не виден. Если бы все ваши изображения были билетом, лежащим на очень темной поверхности, то это снова было бы тривиально, но идея состоит в том, чтобы написать приложение, которое, как мы надеемся, может обрабатывать даже неоднозначные случаи. При этом я бы предложил следующий подход:
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);
}
В дополнение к ответу MoarCodePlz есть два ключевых слова, которые имеют основополагающее значение для вашей задачи: решение гомографии и преобразование Хафа.
В вашем случае прямые (пиксельные) подходы могут быть лучше, чем основанные на функциях.
Хороший учебник по выравниванию изображений можно найти здесь: https://research.microsoft.com/apps/pubs/default.aspx?id=70092
Другая идея — выбрать рентабельность инвестиций. Если вы знаете, что область справа на вашем изображении состоит из красных квадратов, вы можете попытаться исключить ее из обнаружения SURF. Кроме того, вы можете определить форму «области красного квадрата» и использовать ее для оценки преобразования.
Просто найдите самые большие (толстые и длинные) красные линии и выполните аффинную деформацию.