Распознавание изображений с четким, но изменяющимся углом изображения
ПРОБЛЕМА
У меня есть фотография, взятая из качающегося автомобиля. Для простоты я превратил его в черно-белое изображение. Пример показан ниже:
![Figure 1]()
Изображение показывает высокую интенсивность возвращается и имеет шаблон в нем, который обнаружил, что все действительные изображения обведены красным цветом. Это изображение может быть взято под разными углами в зависимости от поворота транспортного средства. Другой пример:
![enter image description here]()
Целью здесь является попытка идентифицировать ячейки изображения, в которых эта модель существует.
ТЕКУЩИЕ ПОДХОДЫ
Я пробовал несколько методов до сих пор, я использую Matlab для тестирования, но в конечном итоге буду реализовывать в С++. Желательно, чтобы алгоритм был эффективным по времени, однако меня интересуют любые предложения.
SURF (Ускоренные надежные функции) Распознавание функций
Я попробовал реализацию MATLAB по умолчанию для SURF, чтобы попытаться найти функции. Matlab SURF может идентифицировать функции в двух примерах (не то же самое, что и выше), однако он не может идентифицировать общие:
![enter image description here]()
Я знаю, что точки разные, но шаблон все еще несколько идентифицируется. Я пробовал несколько наборов изображений, и почти нет общих точек. Из чтения о SURF кажется, что он не является устойчивым к искаженным изображениям в любом случае.
Возможно, некоторые рекомендации по предварительной обработке здесь?
Соответствие шаблонов
Итак, сопоставление шаблонов было проверено, но определенно не идеально подходит для приложения, потому что оно не является надежным для масштабирования или искажения. Я открыт для предварительной обработки идей, чтобы исправить перекос. Это может быть довольно легко, некоторые обсуждения дополнительной информации о картине приводятся ниже.
Теперь давайте исследуем соответствие шаблонов. Скажем, в качестве шаблона и текущего изображения мы имеем следующие два изображения:
![enter image description here]()
Шаблон выбирается из одного из наиболее перспективных изображений. И используя его на очень похожем изображении, мы можем сопоставить позицию:
![enter image description here]()
Но тогда (и несколько явно), если мы изменим картину на другой угол, это не сработает. Конечно, мы ожидаем этого, потому что шаблон no-long выглядит как шаблон на изображении:
![enter image description here]()
Таким образом, мы, очевидно, также нуждаемся в предварительной работе по обработке.
Hough Lines и RANSAC
Строки Hough и RANSAC могут идентифицировать линии для нас, но как мы можем получить положение шаблона?
Другое, о котором я еще не знаю
Я новичок в области обработки изображений, поэтому мне бы хотелось услышать о любых других методах, которые подходят для этой простой, но сложной проблемы с изображением.
Датчик и способ его предварительной обработки
Датчик представляет собой 3d лазер, он был превращен в изображение для этого эксперимента, но все еще сохраняет информацию о расстоянии. Если мы построим масштаб с расстоянием от 0 до 255, получим следующее изображение:
![enter image description here]()
Где легче дальше. Это может определенно помочь нам выровнять изображение, некоторые мысли по наилучшему пути?. До сих пор я думал о таких вещах, как вычисление нормали ячеек, которые не равны 0, мы могли бы также сделать какой-то градиентный спуск или наименьший квадрат, подходящий таким образом, чтобы разница в расстоянии равнялась 0, что могло бы выровнять изображение так, чтобы оно всегда прямая. Проблема в том, что сплошная белая полоса еще далеко? Может быть, мы могли бы сегментировать это? Мы вроде как алгоритмы построения на наших алгоритмах, поэтому нам нужно быть осторожными, чтобы это не стало монстром.
Любая помощь или идеи были бы замечательными, я с удовольствием рассмотрю любой серьезный ответ!
Ответы
Ответ 1
Я придумал следующую программу для сегментирования регионов и, надеюсь, найти интересующую вас модель, используя сопоставление шаблонов. Я добавил несколько комментариев и рисунков, чтобы объяснить поток и некоторые результирующие изображения. Надеюсь, что это поможет.
im = imread('sample.png');
gr = rgb2gray(im);
bw = im2bw(gr, graythresh(gr));
bwsm = imresize(bw, .5);
dism = bwdist(bwsm);
dismnorm = dism/max(dism(:));
figure, imshow(dismnorm, []), title('distance transformed')
eq = histeq(dismnorm);
eqcl = imclose(eq, ones(5));
figure, imshow(eqcl, []), title('histogram equalized and closed')
eqclbw = eqcl < .2; % .2 worked for samples given
eqclbwcl = imclose(eqclbw, ones(5));
figure, imshow(eqclbwcl, []), title('binarized and closed')
filled = imfill(eqclbwcl, 'holes');
figure, imshow(filled, []), title('holes filled')
% -------------------------------------------------
% template
tmpl = zeros(16);
tmpl(3:4, 2:6) = 1;tmpl(11:15, 13:14) = 1;
tmpl(3:10, 7:14) = 1;
st = regionprops(tmpl, 'orientation');
tmplAngle = st.Orientation;
% -------------------------------------------------
lbl = bwlabel(filled);
stats = regionprops(lbl, 'BoundingBox', 'Area', 'Orientation');
figure, imshow(label2rgb(lbl), []), title('labeled')
% here I just take the largest contour for convenience. should consider aspect ratio and any
% other features that can be used to uniquely identify the shape
[mx, id] = max([stats.Area]);
mxbb = stats(id).BoundingBox;
% resize and rotate the template
tmplre = imresize(tmpl, [mxbb(4) mxbb(3)]);
tmplrerot = imrotate(tmplre, stats(id).Orientation-tmplAngle);
xcr = xcorr2(double(filled), double(tmplrerot));
figure, imshow(xcr, []), title('template matching')
Измененное изображение:
![resized]()
сегментированные:
![segmented]()
Соответствие шаблонов:
![2d cross-correlation]()
Ответ 2
Учитывая низкое качество изображения (низкое разрешение + бинаризация), я бы предпочел сопоставление шаблонов, потому что он основан на простой глобальной мере сходства и не пытается выполнить какое-либо извлечение признаков (в ваших выборках нет надежных функций).
Но вам нужно будет применить сопоставление шаблонов с вращением. Один из способов - прекомпретировать вращающиеся экземпляры шаблона, выполнить сопоставления для каждого угла и сохранить лучшее.
![Trained template]()
![Matched template]()
В сравнении можно интегрировать информацию глубины (если это помогает).
Ответ 3
Это очень похоже на проблему распознавания набросанных вручную символов, которые мы решаем в нашей лаборатории, в том смысле, что целевой шаблон является двоичным, с низким разрешением и способным к умеренной деформации.
Основываясь на нашем опыте, я не думаю, что SURF - это правильный путь, как указано в другом месте. Это предполагает, что непрерывное двумерное изображение не является бинарным и сломается в вашем случае. Совпадение шаблонов не подходит для этого типа двоичного изображения: ваши пиксели должны быть слегка смещены, чтобы возвращать низкий результат совпадения, поскольку в значениях пикселей отсутствует локальная пространственная согласованность, чтобы уменьшить незначительные несоосности окна.
Наш подход заключается в том, чтобы попытаться "преобразовать" двоичное изображение в непрерывное или "полутоновое" изображение. Например, см. Ниже:
![Converting line-art to continuous field via edge orientation extrapolation]()
Эти преобразования выполняются путем запуска 1-го производного реберного детектора, например. сверните шаблон 3x3 [0 0 0; 1 0 -1; 0 0 0] и транспонировать по изображению I, чтобы получить dI/dx и dI/dy.
В любом пикселе мы можем получить ориентацию ребра atan2 (dI/dy, dI/dx) из этих двух полей. Мы рассматриваем эту информацию как известно на эскизных пикселях (белые пиксели в вашей проблеме) и неизвестны в черных пикселях. Затем мы используем предположение о гладкости Лапласа для экстраполяции значений для чёрных пикселей из белых. Подробности приведены в этой статье:
http://personal.ee.surrey.ac.uk/Personal/J.Collomosse/pubs/Hu-CVIU-2013.pdf
Если это серьезная проблема, вы можете попробовать использовать дистанционное преобразование вместо этого, удобно в Matlab, используя bwdist, но он не даст точных результатов.
Теперь у нас есть "непрерывное" изображение (в соответствии с правым столбцом изображений выше). Шаблоны оттенков серого кодируют локальную структуру изображения и гораздо более подходят для дескрипторов на основе градиента, таких как SURF и сопоставление шаблонов.
Моей догадкой было бы сначала попробовать совпадение с шаблонами, но поскольку это аффинно чувствительно, я бы пошел по пути и снова использовал подход HOG/Bag of Visual words, как и в нашей предыдущей статье, чтобы соответствовать этим шаблонам.
Мы нашли этот конвейер, чтобы дать современные результаты в распознавании формы на основе эскиза, и мой аспирант успешно использовал в последующей работе для сопоставления иероглифов, поэтому я думаю, что он мог бы неплохо выстрелить в работу типа шаблона вы позируете в своих примерах.
Ответ 4
Я бы:
-
Изображение сегмента
на Z
координаты (расстояние от камеры /LASER ), где Z
скользящая координата превышает порог, существует граница между объектом и фоном (если соседнее значение Z
большое или вне диапазона) или другой объект (если соседнее значение Z
отличается) или само (если соседнее значение Z
отличается, но может быть связано с собой). Это даст вам набор объектов
-
align to viewer
вычислить граничные точки каждого объекта (большинство внешних ребер), определить направление с помощью atan2
повернуть назад к лицу камеры перпендикулярно.
Ваше изображение выглядит как маркер маркера, поэтому в этом случае достаточно поворота вокруг оси Y. Также вы можете масштабировать размер объекта до предопределенного расстояния (если цель всегда одного размера)
Вам нужно знать FOV вашей системы фотоаппарата и для этого откалибровать ось Z
.
-
теперь попытайтесь идентифицировать объект
здесь используйте то, что у вас есть, и также можете добавлять фильтры, такие как пропускаемые объекты с несоответствующим размеру или соотношению сторон... вы можете использовать DFT/DCT или сравнить гистограммы нормализованного/выравниваемого изображения и т.д.....
[PS]
для функций не рекомендуется использовать образ BW-Bit, потому что вы теряете слишком много информации. Вместо этого используйте серию или цвет (обычно достаточно шкалы серого). Я обычно добавляю несколько упрощенных гистограмм небольшой площади (с несколькими разными радиусами) вокруг интересующей точки, которая инвариантна относительно вращения.
Ответ 5
Я не думаю, что SURF - это правильный подход к использованию здесь. SURF предназначен для работы с регулярными изображениями 2D-интенсивности, но то, что вы здесь, представляет собой 3D-облако точек. Существует алгоритм регистрации точечных облаков под названием Iterative Closed Point (ICP). На MATLAB File Exchange существует несколько реализаций, таких как этот.
Edit
Теперь панель инструментов Computer Vision System Toolbox (начиная с версии R2015b) включает функции обработки облаков точек. См. этот пример для регистрации облачных точек и сшивания.
Ответ 6
Посмотрите на соответствие лог-полярному шаблону, это инвариант вращения и масштаба:
http://etd.lsu.edu/docs/available/etd-07072005-113808/unrestricted/Thunuguntla_thesis.pdf