У меня есть двоичное изображение, и я пытаюсь представить граф таким образом, чтобы белые части изображения были вершинами и ребрами, где белые области большой площади вершины, а ребра - белые части, соединяющие большие белые части, которые я обнаружил как вершины. Мне удалось найти центр больших белых частей, используя функции 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)
Но результат в том, что только черные пятна, признаются в качестве компонентов, который является противоположностью, как то, что мне нужно. Я попытался использовать инвертированное изображение, и он дал те же результаты, поскольку я предполагаю, что алгоритм предпочитает пятна, которые полностью ограничены, а не фон (который является белым цветом в моем случае, и вся моя цель, использующая его, что он находит районы, которые не ограничены )
Спасибо за ответ. Я проверю алгоритм, я подозреваю, что переход от теории к практике займет слишком много времени в этом случае :) Надеюсь, нет, но в любом случае это помогает мне искать гораздо более эффективные решения. – Sharonica
ОК! Я опубликовал это, потому что у нас была такая же проблема в лаборатории, в которой я учился, и тот, кто передо мной, использовал этот алгоритм. Это был довольно сложный код, но он касался трехмерных изображений, поэтому, возможно, 2D проще. Кроме того, возможно, некоторые части алгоритма уже доступны в виде кода на C++, например, скелетонизация. – Soltius
В любом случае, удачи! – Soltius