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

Мне нужно спроецировать границу между этими областями на изображение, для этого я разбиваю матрицу на сетку, расстояние между точками (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 шт):
В этой задаче лучше использовать цикл 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()
