Заполните минимальную форму, охватывающую набор точек - PullRequest
1 голос
/ 07 мая 2020

У меня есть массив 2D numpy, инициализированный значением 0, и я выбрал 4 точки в этом массиве. Я хочу интерполировать значения между ними, чтобы создать замкнутую форму и заполнить эту форму значением 1. Вот код

a = np.zeros((256, 256))
depth = np.random.randint(50, 200)
corner1 = np.random.randint(0, 100)
corner2 = np.random.randint(150, 250)
top_max = depth - np.random.randint(10, 25)
bottom_max = depth + np.random.randint(10, 25)
top_max_loc = np.random.randint(corner1 + 10, corner2 - 10)
bottom_max_loc = np.random.randint(corner1 + 10, corner2 - 10)

left_point = (depth, corner1)
right_point = (depth, corner2)
top_point = (top_max, top_max_loc)
bottom_point = (bottom_max, bottom_max_loc)

a[left_point] = 1
a[right_point] = 1
a[top_point] = 1
a[bottom_point] = 1
print(left_point)
print(right_point)
print(top_point)
print(bottom_point)

и график точек

enter image description here

То, что я ищу, - это заполнить массив какой-то случайной формой и получить следующие результаты (только желтая форма)

enter image description here

1 Ответ

1 голос
/ 07 мая 2020

Похоже, вы ищете выпуклую оболочку с учетом набора точек, то есть наименьшей формы, которая их всех охватывает. Для этого вы можете использовать skimage.morphology.convex_hull_image. Поскольку у вас есть только одна фигура, вы можете сократить поиск до ограничивающей рамки набора точек. Для нескольких объектов вас может заинтересовать convex_hull_object.

Вот пример, созданный с вашим кодом:

from skimage.morphology import convex_hull_image

x,y = np.where(a)
x_min, x_max = x.min(), x.max()
y_min, y_max = y.min(), y.max()

plt.figure(figsize=(10,10))
plt.imshow(a[x_min:x_max+1, y_min:y_max+1])

enter image description here

Теперь получите выпуклую оболочку нарезанного изображения и снова присвойте массиву:

a[x_min:x_max+1, y_min:y_max+1] = convex_hull_image(a[x_min:x_max+1, y_min:y_max+1])

Результат:

plt.figure(figsize=(10,10))
plt.imshow(a)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...