Как обнаружить кривые в двоичном изображении? - PullRequest
15 голосов
/ 13 августа 2011

У меня есть двоичное изображение, я хочу обнаружить / отследить кривые на этом изображении.Я ничего не знаю (координаты, угол и т. Д.).Кто-нибудь может направить меня, как мне начать?Предположим, у меня есть это изображение enter image description here

Я хочу выделить кривые и другие линии.Меня интересуют только изогнутые линии и их параметры.Я хочу сохранить информацию о кривых (в массиве) для последующего использования.

Ответы [ 5 ]

13 голосов
/ 13 августа 2011

Это действительно зависит от того, что вы подразумеваете под «кривой».

Если вы хотите просто идентифицировать каждую дискретную совокупность пикселей как «кривую», вы можете использовать подключенных компонентов алгоритм.Каждый компонент будет соответствовать коллекции пикселей.Затем вы можете применить какой-либо тест для определения линейности или какой-либо другой функции компонента.

Если вы ищете прямые линии, круговые кривые или любые другие параметрические кривые, вы можете использовать преобразование Хафа для обнаружения элементов на изображении.

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

ссылки:

1 голос
/ 29 октября 2013

Существует и другое возможное решение с использованием кодов цепей. Понимание кодов цепочки Фримена для OCR

Код цепочки в основном присваивает значение от 1 до 8 (или от 0 до 7) для каждого пикселя, говоря, в каком месте пикселя в 8-соединенной окрестностиваш подключенный предшественник лжи.Таким образом, подобно упоминанию в предложениях Hackworths, каждый выполняет маркировку подключенных компонентов, а затем вычисляет коды цепочек для каждой кривой компонента.Посмотрите на распределение и градиент кодов цепей, можно легко различить линии и кривые.Однако проблема метода заключается в том, что у нас есть осциллирующие кривые, и в этом случае градиент менее полезен, а один зависит от кластеризации кодов цепочек!

1 голос
/ 18 августа 2011

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

Во-первых, вы можете выполнить разделение путем сканирования изображения, а когда вы столкнетесь с черным пикселем, вы можете применить стандартный алгоритм flood-fill , чтобы определить все пиксели в вашей форме. Если у вас есть набор инструментов изображения Matlab, вы можете найти для этого процедуры bwconncomp и bwselect . Если ваши фигуры не полностью связаны, вы можете применить к своему изображению операцию морфологическое закрытие , чтобы соединить фигуры.

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

Другой подход заключается в измерении соотношения расстояния между конечными точками и длиной объекта. Это отношение будет около 1 для линий и больше для кривых и волнистых форм.

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

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

1 голос
/ 13 августа 2011

1) Прочитайте книгу по анализу изображений

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

Если вы хотите отделить кривые от прямых, попробуйте подгонку линии, а затем получите коэффициент корреляции. Аналогичные алгоритмы доступны для кривых, и корреляция говорит о близости точки к идеализированной форме.

0 голосов
/ 13 августа 2011

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

...