Объединение точек на изображении ломанной линией

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

Мне нужно спроецировать границу между этими областями на изображение, для этого я разбиваю матрицу на сетку, расстояние между точками (dx и dy) беру 30 пикселей. Затем "пограничные" точки я записываю в список, и пытаюсь провести между этими же точками на изображении (изображение имеет тот же размер, что матрица) отрезки. Ищу для каждой точки ближайшую и провожу отрезок. Вот код этого алгоритма:

def distance(p1, p2):
    return math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2)

def find_nearest_point(point, points):
    min_distance = float('inf')
    nearest_point = None
    for p in points:
        if p != point:
            dist = distance(point, p)
            if dist < min_distance:
                min_distance = dist
                nearest_point = p
    return nearest_point

def draw_lines(points, path):
    img = Image.open(path)
    draw = ImageDraw(img)
    for point in points:
        nearest_point = find_nearest_point(point, points)
        draw.line((point[0], point[1], nearest_point[0], nearest_point[1]), fill='red', width=2)

    img.show()

Вот что получается в итоге:

введите сюда описание изображения

Это не совсем то, что мне нужно. Мне необходимо соединить все линии ломанной. Что я делаю не так? Вот матрица из приведенного примера:


Ответы (1 шт):

Автор решения: vafelka34

В этой задаче лучше использовать цикл while для перебора точек:

def draw_lines(points, path):
    img = Image.open(path)
    draw = ImageDraw(img)
    while(len(points) > 1):
        point = points[0]
        nearest_point = find_nearest_point(point, points)
        draw.line((point[0], point[1], nearest_point[0], nearest_point[1]), fill='red', width=2)

        points.remove(point)
    img.show()
→ Ссылка