Как обнаружить кривые в двоичном изображении?
У меня есть двоичное изображение, я хочу обнаружить/отслеживать кривые на этом изображении. Я ничего не знаю (координаты, угол и т.д.). Может ли кто-нибудь вести меня, как мне начать? предположим, что у меня есть это изображение ![enter image description here]()
Я хочу выделить кривые и другие строки. Меня интересуют только кривые линии и их параметры. Я хочу хранить информацию кривых (в массиве) для использования позже.
Ответы
Ответ 1
Это действительно зависит от того, что вы подразумеваете под "кривой".
Если вы хотите просто идентифицировать каждый дискретный набор пикселей как "кривую", вы можете использовать алгоритм подключенные компоненты. Каждый компонент будет соответствовать набору пикселей. Затем вы можете применить некоторый тест для определения линейности или какой-либо другой функции компонента.
Если вы ищете прямые линии, круговые кривые или любую другую параметрическую кривую, вы можете использовать Hough transform для обнаружения элементов из изображение.
Лучший подход действительно будет зависеть от того, какие кривые вы ищете и какая информация вам нужна для кривых.
ссылки ссылки:
Ответ 2
1) Прочитайте книгу по анализу изображений
2) Сканирование на черный пиксель, если вы обнаружите, что соседние пиксели также черные, сохраните их местоположение, затем сделайте их белыми. Это получает точки в одном объекте и удаляет их из изображения. Просто продолжайте повторять это, пока не останется оставшихся черных пикселей.
Если вы хотите отделить кривые от прямых, попробуйте установить линию, а затем получите коэффициент корреляции. Аналогичные алгоритмы доступны для кривых, и корреляция указывает на близость точки к идеализированной форме.
Ответ 3
Поскольку у вас уже есть хорошее двоичное изображение, проще всего просто разделить разные связанные компоненты изображения, а затем рассчитать их параметры.
Во-первых, вы можете выполнить разделение, просматривая изображение, а когда вы сталкиваетесь с черным пикселом, вы можете применить стандартную заливку-заливку алгоритм, чтобы узнать все пиксели в вашей форме. Если у вас есть инструментарий для создания матовых изображений, вы можете найти bwconncomp и bwselect для этого. Если ваши формы не полностью подключены, вы можете применить морфологическое закрытие к вашему изображению, чтобы соединить фигуры.
После того, как вы разделили разные фигуры, вы можете отфильтровать кривые, проверив, насколько они отклоняются от линии. Вы можете сделать это, просто подобрав конечные точки кривой и вычислив, насколько далеко другие точки находятся от линии, определяемой конечными точками. Если это значение превышает некоторый максимум, у вас есть кривая вместо линии.
Другим подходом было бы измерение отношения расстояния между конечными точками и длиной объекта. Это соотношение будет около 1 для линий и больше для кривых и волнистых форм.
Если ваши изображения имеют углы, которые вы хотите отделить от кривых, вы можете проверить направленный градиент ваших кривых. Выделите форму, выберите из нее равноудаленные точки и для каждой точки, вычислите угол к предыдущей точке и к следующей точке. Если разница угла слишком велика, у вас нет гладкой кривой, но есть какая-то угловая форма.
Возможные трудности в реализации включают толстые линии, которые вы можете решить с помощью преобразования скелета. Для реализации маклера скелета и определения конечных точек кривой см. документация по инструментам обработки изображений Matlab
Ответ 4
Существует также другое решение с использованием цепных кодов.
Понимание цепочек кодов Freeman для OCR
Код цепи в основном присваивает значение от 1 до 8 (или от 0 до 7) для каждого пикселя, указывающего, в каком месте пикселя в 8-соединенной окрестности лежит ваш подключенный предшественник. Таким образом, как упоминание в предложениях Hackworths, один выполняет маркировку связанных компонентов, а затем вычисляет цепные коды для каждой компонентной кривой. Посмотрите на распределение и градиент цепочечных кодов, легко различать линии и кривые. Проблема с этим методом заключается в том, когда мы имеем оскалирующие кривые, и в этом случае градиент менее полезен и зависит от кластеризации цепных кодов!
Ответ 5
Я не специалист по компьютерному зрению, но я думаю, что вы могли бы легко определить линии/кривые в бинарных изображениях с помощью некоторых основных алгоритмов обнаружения края (например, sobel filter).