Как я могу обнаружить отдельные объекты, когда их края касаются друг друга?

21

Мне нужно найти все контуры на изображении, полученном с камеры. Поэтому я сначала использую детектор краев Canny, чтобы найти края, а затем найти контуры. Довольно просто

Однако мои контуры сливаются. Например, на изображении ниже, у меня явно есть 4 разных объекта. В некоторых точках края слегка соприкасаются, поэтому я получаю один большой контур вместо четырех отдельных. Я пытался изменить пороги, эрозию, морфологические операции и тому подобное, но края немного соприкасались. У кого-нибудь есть какие-либо предложения о том, как получить отдельные контуры на изображениях, подобные приведенному ниже? (Изображение ниже, очевидно, просто пример, мои реальные изображения намного сложнее, но имеют ту же основную проблему).

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

Лорем Ипсум
источник
Сегментация водосбора может работать.
sm176357
Таким образом, вы должны также рассмотреть случаи, когда контакт - это линия, а не просто точка (касание, но не наложение)
Shravya Boggarapu

Ответы:

11

Обнаружение различных компонентов:

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

img = Binarize@Import["http://i.stack.imgur.com/yqDyu.png"];
Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]

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

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

Обнаружение различных контуров:

Однако, если вы действительно хотите отделить только контуры, вот пример. Эрозия и расширение выполняются, как и прежде, чтобы закрыть зазор, и полученное изображение пропускается через детектор краев Canny. Я сделал параметры по умолчанию явными, чтобы вы могли видеть, что используется.

img2 = EdgeDetect[Dilation[Erosion[img, 1], 1], Method -> "Canny"]

Это даст вам как внутренний, так и внешний край (см. Рисунок слева ниже), поскольку ширина пикселя больше 1 вокруг. Мне не очень повезло, пытаясь сделать его тоньше, так как производительность ухудшается (может отличаться для других ваших изображений). Внутренние контуры - это те, которые вам нужны, а внешний контур - это просто объединенный контур всех 4 компонентов. Теперь все, что нам нужно сделать, это отбросить самый внешний с помощью:

SelectComponents[img2, "EnclosingComponentCount", # > 0 &]

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

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

Обратите внимание, что видимые разрывы на рисунке связаны с сохранением в формате JPEG в меньшем размере. На моем экране это выглядит не так.

Лорем Ипсум
источник
2

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


источник
Я попробовал это, но результаты не показали улучшения.
1
Можете ли вы показать реальный пример изображения?
2

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

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


источник
Спасибо. Моя программа используется для обнаружения рук, поэтому я думаю, что она будет очень похожа на обнаружение объектов. Вы дали какие-нибудь предложения для более сложных и надежных алгоритмов? Haar Features, SURF и подобные алгоритмы машинного обучения - это не то, что я могу сделать.
Вы смотрели на эти ресурсы? paginas.fe.up.pt/~hgc2011 В основном это базы данных / результаты, но я надеюсь, что вы сможете найти здесь несколько хороших статей.
0

Контуры не обязательно открыты, если учесть, что вы использовали хитрый для их обнаружения. Проблемы с Canny уже обсуждались здесь . обсуждение на Осторожном дает основную идею , что есть еще такие операции , как закрытие и дилатация, которые требуют сверху Осторожного с оцененными замкнутыми контурами.

Это также зависит от того, ищем ли мы контуры или сегментацию (Canny против таких методов, как Graphcuts ). Так что я думаю, что поиск надежного решения зависит от вашего окончательного применения.

beedot
источник