Альтернативы преобразованию Хафа для обнаружения решетчатой ​​структуры

16

У меня есть изображение, которое состоит из нескольких «углов», которые образуют форму сетки:

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

После некоторого поиска Hough показался мне подходящим, потому что его не беспокоили разрывы в строках. Однако проблема, с которой я столкнулся, заключается в том, что мои линии «жирные», и любое обнаружение краев, которое я запускаю (в данном случае Canny), выделяет края линии, а не середину:

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

Это означает, что преобразование Хафа заканчивается выделением одной (или обеих) «сторон» линий сетки, а не середины.

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

Учитывая, что я знаю, что я ищу (эта сетчатая форма, всегда примерно одинаковой ориентации), есть ли лучший способ выполнить часть «Обнаружение края», чтобы дать мне центральные линии, или я должен искать на совершенно другой метод?

Benjol
источник
Для контекста эта сетка будет сравниваться с номинальной сеткой для выполнения калибровки камеры Цай.
Бенджол
«Обнаружение края, которое я запускаю, выбирает края линии» Да, потому что обнаружение края преобразует края в ребра, и ваше изображение уже является ребрами . Край - это граница между светом и тьмой.
эндолит

Ответы:

10

Преобразование Хафа действительно помогло бы в этом. Чтобы «утончить» линии, вы можете рассмотреть операцию скелетонизации

Это создаст изображение, подобное этому: Выход скелетонизации

Из-за способа, которым работает скелетонизация, он все равно будет создавать некоторые линии, которые будут казаться не относящимися к сетке, но эти линии в направлении «ошибочных» направлений не так уж много (по крайней мере на данном изображении), чтобы запутать обнаружение линий преобразования Хафа слишком много, и он четко выберет два основных набора линий в разных направлениях. (Вот как выглядит вывод HT:) введите описание изображения здесь

Если вы используете MATLAB, вы можете проверить эту страницу справки

a_a
источник
Благодарность! Это очень помогает. У меня еще нет лицензии на MATLAB, но я попробовал ее с помощью SimpleSkeletonization от AForge, и она работает лучше ... Хотя все еще не идеально. Я вернусь к этой теме позже, когда получу реальные данные для проверки.
Бенджол
Возможно, вы захотите сначала установить пороговое значение для своего исходного изображения на некотором пороге, который, по-видимому, дает «оптимальные» жирные линии сетки. Под оптимальным я подразумеваю, что они по крайней мере связаны. Это может улучшить производительность скелетонизации, но у вас будет дополнительный параметр для определения (порог). Может быть, стоит также посмотреть, как улучшить получение изображений.
A_A
да, как я уже сказал, когда у меня будут реальные данные для игры, будет стоить моего времени на тонкую настройку системы. Одно серьезное сомнение, которое у меня есть в отношении Hough в целом, заключается в том, что дискретизация тета будет работать с точностью до субпикселя, которая нам нужна. (Это, и я не совсем уверен, что аберрации объектива не будут означать, что линии могут быть изогнутыми, а не прямыми ...)
Бенджол
11

Альтернативой преобразованию Хафа будет преобразование Радона ( 1 , 2 ). Грубое описание алгоритма для обнаружения решетчатой ​​структуры может выглядеть следующим образом:

1. Perform Radon Transform from 0 to 180 degrees.
2. Find the two highest maxima in the angle bins.
3. For the two angles with maximal amplitude find the local maxima within the bin.
4. You can use the constraint that the maxima should have even spacing to deal with outliers.

РЕДАКТИРОВАТЬ :

Вот небольшой фрагмент кода Matlab для иллюстрации шага 1-3:

im = imread('grid.png');
[R, xp] = radon(im, 0:180);
imagesc(0:180, xp, R)

Результат преобразования Радона

plot(max(R)) % the two maxima are at 65 & 117 degrees

Максима по всем углам

plot(R(:, 65))

Максима на 65 градусов

plot(R(:,117))

Максима на 117 градусов

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

bjoernz
источник
Спасибо, не могли бы вы сказать в двух словах, какое преимущество вы ожидаете от преобразования Радона по сравнению с преобразованием Хафа?
Бенджол
@benjol, я обновил свой ответ.
bjoernz
Очень хорошо, спасибо большое. Как только он даст мне доступ к Matlab, я попробую!
Бенджол