Соединительные кромки, обнаруженные детектором кромок

14

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

Я попробовал преобразование Хафа, но у меня это не получилось, потому что у меня нет прямых линий. Расширение и эрозия также не являются хорошими; они делают изображения более грязными.

Подход, который я пробую, состоит в том, чтобы сначала обнаружить вершины и узлы (в MATLAB с bwmorph), а затем сделать листья как отдельную особенность. Это делается следующим образом:

  1. Сканирование в окне 3х3, поиск соседей.
  2. Пройдите через весь связанный объект.
  3. Попытайтесь соответствовать линии (или возможно квадратный многочлен).
  4. Проверьте функцию за функцией, если оно стоит подключения или нет.

Реализация не проста, так как часть принятия решения, где вершины должны быть связаны, сложна.

Naresh
источник
Я нашел интересное решение, чтобы найти ответвления. MATLAB может легко определить местоположение узлов. MATLAB также может маркировать связанные функции. Таким образом, вы можете выбрать одну подключенную функцию. Найти узлы. Установите эти узлы на 0. В основном отключите функцию и пометьте их снова. У вас будут ветви на деревьях. Это потребовало меньше ручного программирования, и результаты кажутся хорошими. Какой-то вклад?
Нареш
Что касается соединения, то сейчас я думаю о поиске крупных функций и считаю их более надежными. Затем, если они являются прямыми линиями (проверьте качество пригодности), преобразуйте их в полярные координаты и ищите окрестности, как грубое преобразование. Для больших объектов радиус поиска большой (пропорционален размеру). Я реализую этот код. Результаты на подходе. Комментарии пожалуйста.
Нареш

Ответы:

4

Это может быть не полным решением, но даст вам хорошее направление.

По сути, каков основной критерий того, что ребра совпадают? То, что «локально» градиент кромки совпадает, и в некоторой степени расстояния являются разумными относительно продолжительности кромки.

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

Как только меньшие промежутки заполнены, вы можете увеличить их, чтобы увеличить размер. пиков будет больше, но вы можете выбрать меньшее из них.

Дипан Мехта
источник
спасибо Дипан, я тоже об этом думал. Это будет дорогостоящая операция, но я могу извлечь некоторую информацию. Но иногда трансформация Хогу тоже не дает мне связных линий. Hough заботится только о совершенных прямых линиях. И не заботится о связности пикселей. Он просто помещает линию в 3 или более случайных пикселя на прямой линии. Я кодирую свою гипотезу. Я опубликую результаты здесь для дальнейшего обсуждения. Нареш
Нареш
θ
4

Это не так просто ... Вы можете попробовать полностью поработать со структурой Graph. Сначала извлеките все связанные пиксели из изображения и вставьте их в график, где соседние узлы соединены ребром. Вы можете отказаться от графиков, размер которых меньше некоторого числа M узлов (чтобы исключить небольшие пятна, не относящиеся к изображению).

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

Вы можете найти экстремальные точки каждого графика (экстремальные пиксели на периферии каждого графика), начав с некоторого случайного узла и выполнив DFS .

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

Теперь вы можете попытаться соединить ближайших экстремальных точек соседей (с расстоянием <= 5) просто прямой линией.

Но, если вы хотите принять во внимание наклон отрезка линии, который приводит к этому экстремальному пикселю, вы можете попытаться «подогнать линию» по N пикселям ДО достижения этого экстремального пикселя. Таким образом, если N = 5, то последние 5 пикселей ветви будут использоваться при оценке линии.

Следовательно, для каждой пары ближайших соседей у ​​вас теперь есть еще одна вещь, которую можно использовать в качестве критерия, чтобы судить, должны ли два сегмента быть соединены (то есть расстояние до экстремальной точки <= 5 пикселей И примерно равный наклон линии).

Чтобы свести к минимуму влияние шума, который может привести к тому, что ваши линии будут выглядеть неровными возле кончиков ветви (и, следовательно, исказить оценку уклона), вы можете попробовать применить шаг упрощения к вашему графику (это еще один момент (помимо DFS выше), где он платит работа со структурой Графа). Например, вы можете удалить последующие узлы графика, из-за которых линия будет «сгибаться» под углами, превышающими некоторый предел (что-то более сложное см. Здесь ). Таким образом вы подгоните «более простые» линии примерно к направлению большей части сегмента, образованного пикселями изображения.

Это, вероятно, приведет к приличным связям в большинстве случаев (судя по изображению, которое вы разместили), но все равно оставит вас с некоторыми сложными. Например, как может быть соединен прерывистый шаблон в форме Y, где одна из ветвей прерывается вблизи точки соединения? (т.е. у вас есть «непрерывный» изгиб, который должен быть связан с отрезком, который «сливается» с ним). Возможно, вы сможете проверить, насколько распространены такие случаи, и пересмотреть критерии подключения позже.

Также, возможно, стоит изучить, как можно улучшить получение изображений (например, увеличить разрешение).

a_a
источник
Спасибо за хороший ответ. Да, ваше наблюдение верно. Это не дерево, поэтому лучше сделать график. Это поможет мне также найти циклы. Дело в том, что MATLAB реализовал граф в ящике для инструментов биоинформации, что, я не могу предположить, будет у большинства людей. Больше всего я могу пойти, это ящик для инструментов обработки изображений. Дуглас-Пикер - это тоже то, что я рассмотрел. Но после консультации с экспертом по ГИС я понял, что это может усложнить ситуацию и получить пересекающиеся линии. Кроме того, мне нужно взглянуть на разные сегменты линий на графике, так как мне нужно 10 пикселей, чтобы сделать линию, и у меня уже может быть раздвоение.
Нареш