2015-09-22 20 views
2

У меня есть двоичное изображение, и я ищу надежный способ найти линии в форме и топологии (как соединяются линии).Найти строки в форме

Я экспериментировал в matlab (хотя то, что я прошу, это какие методы использовать).

Я попытался использовать скелетонизацию на двоичном изображении, а затем использовал hough-transform, работает иногда, но не является надежным решением. Я боролся с пограничными волнениями.

Может ли кто-нибудь указать мне, какие методы использовать здесь (и в каком порядке).

Start (binary image) End result I want

Binary file for testing

+0

скелетированию +, находя пиксели с 'num_neighrbours = 2' (refeering до * зеленый */1 соседей в изображении) должно дать вам точку соединения. Можете ли вы загрузить изображение в формате B & W без «B» на нем для тестирования? –

+0

Я загрузил изображение как .mat-файл, см. Отредактированный пост. Не тот, что на изображении, но тот, на который я хочу работать. Спасибо за ваш ответ! –

+0

Является ли второе изображение тем, чего вы пытаетесь достичь с первого изображения?Можете ли вы немного разобраться, какие у вас проблемы с преобразованием hough? –

ответ

0

Это действительно сложная проблема, переходя из бинарного изображения в виде графика (т.е. топологии). В основном связано с пересечением из дискретного мира пикселей и данных 2D-изображения, абстрактной структурой данных узлов и связности ...

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

К счастью, кто-то поделились хорошей попыткой здесь в Python:. http://planet.lengrand.fr/?post_id=267

(Это, очевидно, предполагает полную установку питона NetworkX и любые другие зависимости, я сделал это на Mac с доморощенным через несколько вызовов, такие, как > brew install opencv; pip install networkx; brew install graph-tool; brew install graphviz . В ноутбуке ipython ниже также используется http://scikit-image.org и http://mahotas.readthedocs.org/en/latest/ - вот довольно пьянящий коктейль с компьютерным зрением и кодом обработки изображений! Наконец: вам обязательно понадобится ipython ...)

Вот пример (который первые загрузки загруженного ноутбука сверху - все выполняется от: > ipython —pylab):

%run C8Skeleton_to_graph-01.ipynb 

import scipy.io as sio # Need this to load matlab files... 

mat = sio.loadmat('bw.mat') 

img = np.zeros((30,70),np.uint8) # Buffered image border 

img[5:25,5:65] = mat['BW'] # Insert matrix data into middle 

skeleton = mh.thin(img) # Do skeletonization... 

graph = nx.MultiGraph() # Graph we’ll create 

C8_Skeleton_To_Graph_01(graph, skeleton) # Do it! 

figure(1) 
subplot(211) 
plt.imshow(img,plt.get_cmap('gray'), vmin=0, vmax=1, origin='upper'); 
subplot(212) 
plt.imshow(skeleton,plt.get_cmap('gray'), vmin=0, vmax=1, origin='upper'); 

figure(2) 
nx.draw(graph) 

Показаны что скелетирование ваших первоначально предоставленных данных Matlab (с буфером вокруг краев):

Skeletonization the original data.

Результаты в следующем графике:

enter image description here

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

EDIT:, но его можно решить, удалив на диаграмме отклоняющие дуги (ведущие к узлам листа со степенью == 1). например

remove = [node for node,degree in graph.degree().items() if degree == 1] 

graph.remove_nodes_from(remove) 

nx.draw(graph) 

Trimmed graph

+0

Вы не думаете, что скелетонизация удаляет довольно ценную информацию? –

2

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

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

enter image description here

Это только простое сканирование (1), идентификация вертикальной и горизонтальной линий (2) наряду с дальнейшим анализом более сложных областей (3). Имея все проанализированные области (3), трудно найти точки пересечения и оптимизировать их (4).

Результат довольно грубый, но это подтверждает выполнимость, если такой подход.

Я понимаю, что это немного далеко от Matlab, но я просто хочу, чтобы выделить несколько важных моментов:

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

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

enter image description here

С более точками шагов пересечения может быть определен более точно:

enter image description here

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

Update

ли этот подход работать, если фигура не имела большинство вертикальных и горизонтальных линий?

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

enter image description here

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

enter image description here

+0

Хорошая работа, спасибо за обмен. Конечный результат выглядит очень многообещающим. Однако будет ли этот подход работать, если на рисунке не было большинства вертикальных и горизонтальных линий? –

+0

@ DanielAkesson, см. Обновленный ответ. –

Смежные вопросы