Это не так просто ... Вы можете попробовать полностью поработать со структурой Graph. Сначала извлеките все связанные пиксели из изображения и вставьте их в график, где соседние узлы соединены ребром. Вы можете отказаться от графиков, размер которых меньше некоторого числа M узлов (чтобы исключить небольшие пятна, не относящиеся к изображению).
В конце этого процесса у вас будет набор отключенных графиков. (Судя по вашему изображению, это не совсем деревья, потому что там есть циклы)
Вы можете найти экстремальные точки каждого графика (экстремальные пиксели на периферии каждого графика), начав с некоторого случайного узла и выполнив DFS .
В конце этого процесса у вас будет набор пиксельных координат для каждого Графа, соответствующих экстремальным точкам, где соединения могут формироваться с большей вероятностью.
Теперь вы можете попытаться соединить ближайших экстремальных точек соседей (с расстоянием <= 5) просто прямой линией.
Но, если вы хотите принять во внимание наклон отрезка линии, который приводит к этому экстремальному пикселю, вы можете попытаться «подогнать линию» по N пикселям ДО достижения этого экстремального пикселя. Таким образом, если N = 5, то последние 5 пикселей ветви будут использоваться при оценке линии.
Следовательно, для каждой пары ближайших соседей у вас теперь есть еще одна вещь, которую можно использовать в качестве критерия, чтобы судить, должны ли два сегмента быть соединены (то есть расстояние до экстремальной точки <= 5 пикселей И примерно равный наклон линии).
Чтобы свести к минимуму влияние шума, который может привести к тому, что ваши линии будут выглядеть неровными возле кончиков ветви (и, следовательно, исказить оценку уклона), вы можете попробовать применить шаг упрощения к вашему графику (это еще один момент (помимо DFS выше), где он платит работа со структурой Графа). Например, вы можете удалить последующие узлы графика, из-за которых линия будет «сгибаться» под углами, превышающими некоторый предел (что-то более сложное см. Здесь ). Таким образом вы подгоните «более простые» линии примерно к направлению большей части сегмента, образованного пикселями изображения.
Это, вероятно, приведет к приличным связям в большинстве случаев (судя по изображению, которое вы разместили), но все равно оставит вас с некоторыми сложными. Например, как может быть соединен прерывистый шаблон в форме Y, где одна из ветвей прерывается вблизи точки соединения? (т.е. у вас есть «непрерывный» изгиб, который должен быть связан с отрезком, который «сливается» с ним). Возможно, вы сможете проверить, насколько распространены такие случаи, и пересмотреть критерии подключения позже.
Также, возможно, стоит изучить, как можно улучшить получение изображений (например, увеличить разрешение).