У меня есть двоичное изображение, полученное от детектора острых краев. Края плохо видны в центре, и мне нужно их соединить. Соединение ребер зависит от ориентации и соседства. Мне нужно соединить вершины, если они ниже порогового значения (скажем, менее 5 пикселей). Если мои почти линейные особенности хорошо ориентированы, этот порог должен быть ослаблен. (Это лучший случай.)
Я попробовал преобразование Хафа, но у меня это не получилось, потому что у меня нет прямых линий. Расширение и эрозия также не являются хорошими; они делают изображения более грязными.
Подход, который я пробую, состоит в том, чтобы сначала обнаружить вершины и узлы (в MATLAB с bwmorph
), а затем сделать листья как отдельную особенность. Это делается следующим образом:
- Сканирование в окне 3х3, поиск соседей.
- Пройдите через весь связанный объект.
- Попытайтесь соответствовать линии (или возможно квадратный многочлен).
- Проверьте функцию за функцией, если оно стоит подключения или нет.
Реализация не проста, так как часть принятия решения, где вершины должны быть связаны, сложна.
Ответы:
Это может быть не полным решением, но даст вам хорошее направление.
По сути, каков основной критерий того, что ребра совпадают? То, что «локально» градиент кромки совпадает, и в некоторой степени расстояния являются разумными относительно продолжительности кромки.
Если у вас есть геометрические края, такие как длинные прямые линии, Hough сделает очень плавную работу прямо сейчас. Но это не работает, когда ребра имеют произвольную кривую. В этом случае вы все еще можете думать о кривой как о кусочно-постоянных сегментах (достаточно хороших в вашем случае), следовательно, вы должны брать Hough локально. то есть вы можете взять небольшую часть изображения (скажем, блок), вычислить Hough и определить некоторые пики. Основываясь на этом, вы можете определить, что де-хахинг создает значительный разрыв, если так, сохраните его или продолжайте.
Как только меньшие промежутки заполнены, вы можете увеличить их, чтобы увеличить размер. пиков будет больше, но вы можете выбрать меньшее из них.
источник
Это не так просто ... Вы можете попробовать полностью поработать со структурой Graph. Сначала извлеките все связанные пиксели из изображения и вставьте их в график, где соседние узлы соединены ребром. Вы можете отказаться от графиков, размер которых меньше некоторого числа M узлов (чтобы исключить небольшие пятна, не относящиеся к изображению).
В конце этого процесса у вас будет набор отключенных графиков. (Судя по вашему изображению, это не совсем деревья, потому что там есть циклы)
Вы можете найти экстремальные точки каждого графика (экстремальные пиксели на периферии каждого графика), начав с некоторого случайного узла и выполнив DFS .
В конце этого процесса у вас будет набор пиксельных координат для каждого Графа, соответствующих экстремальным точкам, где соединения могут формироваться с большей вероятностью.
Теперь вы можете попытаться соединить ближайших экстремальных точек соседей (с расстоянием <= 5) просто прямой линией.
Но, если вы хотите принять во внимание наклон отрезка линии, который приводит к этому экстремальному пикселю, вы можете попытаться «подогнать линию» по N пикселям ДО достижения этого экстремального пикселя. Таким образом, если N = 5, то последние 5 пикселей ветви будут использоваться при оценке линии.
Следовательно, для каждой пары ближайших соседей у вас теперь есть еще одна вещь, которую можно использовать в качестве критерия, чтобы судить, должны ли два сегмента быть соединены (то есть расстояние до экстремальной точки <= 5 пикселей И примерно равный наклон линии).
Чтобы свести к минимуму влияние шума, который может привести к тому, что ваши линии будут выглядеть неровными возле кончиков ветви (и, следовательно, исказить оценку уклона), вы можете попробовать применить шаг упрощения к вашему графику (это еще один момент (помимо DFS выше), где он платит работа со структурой Графа). Например, вы можете удалить последующие узлы графика, из-за которых линия будет «сгибаться» под углами, превышающими некоторый предел (что-то более сложное см. Здесь ). Таким образом вы подгоните «более простые» линии примерно к направлению большей части сегмента, образованного пикселями изображения.
Это, вероятно, приведет к приличным связям в большинстве случаев (судя по изображению, которое вы разместили), но все равно оставит вас с некоторыми сложными. Например, как может быть соединен прерывистый шаблон в форме Y, где одна из ветвей прерывается вблизи точки соединения? (т.е. у вас есть «непрерывный» изгиб, который должен быть связан с отрезком, который «сливается» с ним). Возможно, вы сможете проверить, насколько распространены такие случаи, и пересмотреть критерии подключения позже.
Также, возможно, стоит изучить, как можно улучшить получение изображений (например, увеличить разрешение).
источник