Мне нужно найти все контуры на изображении, полученном с камеры. Поэтому я сначала использую детектор краев Canny, чтобы найти края, а затем найти контуры. Довольно просто
Однако мои контуры сливаются. Например, на изображении ниже, у меня явно есть 4 разных объекта. В некоторых точках края слегка соприкасаются, поэтому я получаю один большой контур вместо четырех отдельных. Я пытался изменить пороги, эрозию, морфологические операции и тому подобное, но края немного соприкасались. У кого-нибудь есть какие-либо предложения о том, как получить отдельные контуры на изображениях, подобные приведенному ниже? (Изображение ниже, очевидно, просто пример, мои реальные изображения намного сложнее, но имеют ту же основную проблему).
image-processing
edge-detection
Лорем Ипсум
источник
источник
Ответы:
Обнаружение различных компонентов:
Если вы пытаетесь обнаружить различные компоненты, возможно, существуют другие подходы к их выполнению, кроме определения контуров. Вот пример в Mathematica. Эрозия с последующим расширением используется, чтобы закрыть зазор во втором компоненте до обнаружения (если вы этого не сделаете, он не обнаружит).
На рисунке слева внизу показано обнаружение несовершенных объектов (без устранения разрыва), а справа показано правильное обнаружение (с использованием приведенного выше кода).
Обнаружение различных контуров:
Однако, если вы действительно хотите отделить только контуры, вот пример. Эрозия и расширение выполняются, как и прежде, чтобы закрыть зазор, и полученное изображение пропускается через детектор краев Canny. Я сделал параметры по умолчанию явными, чтобы вы могли видеть, что используется.
Это даст вам как внутренний, так и внешний край (см. Рисунок слева ниже), поскольку ширина пикселя больше 1 вокруг. Мне не очень повезло, пытаясь сделать его тоньше, так как производительность ухудшается (может отличаться для других ваших изображений). Внутренние контуры - это те, которые вам нужны, а внешний контур - это просто объединенный контур всех 4 компонентов. Теперь все, что нам нужно сделать, это отбросить самый внешний с помощью:
который дает вам только внутренние контуры (см. справа внизу). Другими словами, он выбирает только те контуры, которые окружены хотя бы одним другим контуром, который автоматически дисквалифицирует самый внешний. Я не знаю эквивалента этих команд / операций в openCV.
Обратите внимание, что видимые разрывы на рисунке связаны с сохранением в формате JPEG в меньшем размере. На моем экране это выглядит не так.
источник
Попробуйте предварительно обработать ваши изображения с помощью морфологического фильтра, такого как эрозия . Это позволит разделить касающиеся контуры. После определения ваших контуров вы можете применить операцию расширения для завершения решеток.
источник
Это не ответ на ваш вопрос, но анализ контуров подвержен ошибкам. Вы не можете ничего с этим поделать, и это работает только в очень простых сценариях.
Если у вас возникли проблемы с его использованием, вы должны искать совершенно другой алгоритм. Существуют более сложные и надежные способы решения проблем, но это зависит от того, чего вы хотите достичь (обнаружение объектов, отслеживание и т. Д.)
источник
Контуры не обязательно открыты, если учесть, что вы использовали хитрый для их обнаружения. Проблемы с Canny уже обсуждались здесь . обсуждение на Осторожном дает основную идею , что есть еще такие операции , как закрытие и дилатация, которые требуют сверху Осторожного с оцененными замкнутыми контурами.
Это также зависит от того, ищем ли мы контуры или сегментацию (Canny против таких методов, как Graphcuts ). Так что я думаю, что поиск надежного решения зависит от вашего окончательного применения.
источник