2016-12-11 4 views
3

У меня есть двоичное изображение, и я пытаюсь представить граф таким образом, чтобы белые части изображения были вершинами и ребрами, где белые области большой площади вершины, а ребра - белые части, соединяющие большие белые части, которые я обнаружил как вершины. Мне удалось найти центр больших белых частей, используя функции OpenCV, такие как эрозия, findContours и моменты, используя моменты центроидов. Итак, у меня есть вершины графа. Моя следующая цель - получить ребра, что означает поиск линий, которые находятся только в БЕЛОЙ ЗОНЕ, которые представлены двумя точками (x1, y1) и (x2, y2). Я пытался использовать все виды функции, такие как: cv2.Canny() cv2.findLine cv2.findContour с различными параметрами на бинарном изображенииНайти ребра (грани графа) в двоичном изображении с помощью OpenCV

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

Некоторых сегментов кода, которые я использовал в моем проекте: Сначала находят края, учитывая бинарное изображение (finalImage) и вернуть центроиды

def findCentroids(finalImage): 
_, contours0, hierarchy = cv2.findContours(finalImage.copy(), cv2.RETR_LIST,     cv2.CHAIN_APPROX_NONE) 
moments = [cv2.moments(cnt) for cnt in contours0] 
centroids = [] 
for M in moments: 
    if M["m00"] != 0: 
     cX = int(M["m10"]/M["m00"]) 
     cY = int(M["m01"]/M["m00"]) 
     centroids.append((cX, cY)) 
return centroids 

Так как я нашел центроиды, я хочу, чтобы найти больше центроид (чтобы сделать изображение менее стираемым), а затем, возможно, найти все ребра, которые соединяются между этими центроидами. Это не похоже на хороший метод, поэтому я надеюсь лучше подходить к ответам.

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

output = cv2.connectedComponentsWithStats((imageForEdges), 8, cv2.CV_32S) 

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

ответ

1

Вы проверили алгоритм Ивановского? https://pdfs.semanticscholar.org/cd14/22f1e33022b0bede3f4a03844bc7dcc979ed.pdf «В статье описывается метод анализа содержимого двоичного изображения, чтобы найти его структуру. Класс изображений, с которыми он имеет дело, состоит из изображений, показывающих на своих передних группах объекты, связанные друг с другом, образуя граф подобная структура. Описанный метод автоматически извлекает эту структуру из растрового изображения и создает матрицу, содержащую соединения между всеми объектами, показанными на входном изображении ».

+0

Спасибо за ответ. Я проверю алгоритм, я подозреваю, что переход от теории к практике займет слишком много времени в этом случае :) Надеюсь, нет, но в любом случае это помогает мне искать гораздо более эффективные решения. – Sharonica

+0

ОК! Я опубликовал это, потому что у нас была такая же проблема в лаборатории, в которой я учился, и тот, кто передо мной, использовал этот алгоритм. Это был довольно сложный код, но он касался трехмерных изображений, поэтому, возможно, 2D проще. Кроме того, возможно, некоторые части алгоритма уже доступны в виде кода на C++, например, скелетонизация. – Soltius

+0

В любом случае, удачи! – Soltius

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