Обнаружение узлов сетки с использованием OpenCV (или использование чего-то другого)

У меня есть сетка на снимках (они из камеры). После бинаризации они выглядят так (красный - 255, синий - 0): grid

Каков наилучший способ обнаружения узлов сетки (крестов) на этих снимках? Примечание: сетка искажается из ячейки в ячейку неравномерно.

Update:

Некоторые примеры различных сеток и их искажений перед бинаризацией: введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Ответ 1

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

Imgur

Затем я попробовал множество инструментов, чтобы получить наиболее заметные функции, подчеркнутые навалом. Наконец, играя с плагином Gimp G'MIC, я нашел это:

Imgur

Исходя из вышеизложенного, я подготовил универсальный шаблон, который выглядит так:

Imgur

Тогда я просто получил часть этого изображения:

Imgur

Чтобы помочь определить угол, я сделал локальный график частоты Фурье - таким образом вы можете получить локальный угол вашего шаблона:

Imgur

Тогда вы можете сделать простую толщину, которая быстро работает на современных графических процессорах - получите такую ​​же разницу (пропущенный случай):

Imgur

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

Imgur

Как вы можете видеть, можно различать хиты и промахи. Важно установить правильную допуск и использовать частоты Фурье для получения угла (с пороговыми изображениями Фурье обычно следует общей ориентации анализируемого изображения). Вышеупомянутый способ может быть позже дополнен обнаружением Харриса, или обнаружение Харриса может быть изменено с использованием вышеприведенных рисунков, чтобы отличить два-четыре близко расположенных угла. К сожалению, все методы зависят от масштаба в таком случае и должны быть соответствующим образом скорректированы. Существуют также другие подходы к вашей проблеме, например, сначала путем их водоразбора, затем получения областей, а затем игнорирования переднего плана, затем упрощения кривых, а затем проверки того, являются ли их углы последовательным эквидистантным шаблоном. Но для моего носа это не принесло бы правильных результатов.

Еще одна вещь - libgmic - это библиотека G'MIC, где вы можете напрямую или через привязки использовать преобразования, показанные выше. Или получите алгоритмы и перепишите их в своем приложении.

Ответ 2

Я полагаю, что это может быть потенциальным ответом (фактически упомянутым в комментариях): http://opencv.itseez.com/2.4/modules/imgproc/doc/feature_detection.html?highlight=hough#houghlinesp

Также могут быть другие способы использования инструментов для просмотра объектов.

Но на самом деле я думаю, что вместо преобразования Хафа, которое могло бы способствовать огромному раздуванию и отсутствию точности (прямые линии), я бы предложил попробовать обнаружение угла Харриса - http://docs.opencv.org/2.4/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.html.

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

Ответ 3

Возможно, вы облако вычислите Hough Lines и определите пересечения. Документацию OpenCV можно найти здесь