Это действительно сложная проблема, переходя из бинарного изображения в виде графика (т.е. топологии). В основном связано с пересечением из дискретного мира пикселей и данных 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 (с буфером вокруг краев):
Результаты в следующем графике:
Обратите внимание на график топология и макет соответствуют структуре разреженного изображения, включая «шпоры» созданный в конце. Это постоянная проблема/область исследований с таким подходом ...
EDIT:, но его можно решить, удалив на диаграмме отклоняющие дуги (ведущие к узлам листа со степенью == 1). например
remove = [node for node,degree in graph.degree().items() if degree == 1]
graph.remove_nodes_from(remove)
nx.draw(graph)
скелетированию +, находя пиксели с 'num_neighrbours = 2' (refeering до * зеленый */1 соседей в изображении) должно дать вам точку соединения. Можете ли вы загрузить изображение в формате B & W без «B» на нем для тестирования? –
Я загрузил изображение как .mat-файл, см. Отредактированный пост. Не тот, что на изображении, но тот, на который я хочу работать. Спасибо за ваш ответ! –
Является ли второе изображение тем, чего вы пытаетесь достичь с первого изображения?Можете ли вы немного разобраться, какие у вас проблемы с преобразованием hough? –