2

У меня есть многоугольник, который я хочу превратить в массив маски, так что все точки, которые попадают внутрь/вне многоугольника, являются True/False. Я думал, что нашел идеальное решение (SciPy Create 2D Polygon Mask), но почему-то это не работает!python: превратить многоугольник в маску array

Что я делаю неправильно?

#!/usr/bin/env python3 

import numpy as np 
import scipy as sp 
from PIL import Image, ImageDraw 

nx, ny = 10, 10 

poly = np.array([(1, 1), (6, 2), (9, 9), (3, 7)]) 

img = Image.new("L", [nx, ny], 0) 
ImageDraw.Draw(img).polygon(poly, outline=1, fill=1) 
mask = np.array(img) 

print(mask) 
# [[1 0 0 0 0 0 0 0 0 0] 
# [0 0 0 0 0 0 0 0 0 0] 
# [0 0 0 0 0 0 0 0 0 0] 
# [0 0 0 0 0 0 0 0 0 0] 
# [0 0 0 0 0 0 0 0 0 0] 
# [0 0 0 0 0 0 0 0 0 0] 
# [0 0 0 0 0 0 0 0 0 0] 
# [0 0 0 0 0 0 0 0 0 0] 
# [0 0 0 0 0 0 0 0 0 0] 
# [0 0 0 0 0 0 0 0 0 0]] 

Более широкий контекст: Я работаю с особенностями произвольной формы на прямоугольной сетке. У меня есть индексы всех граничных точек на сетке, и я хочу, чтобы индексы выпуклой оболочки вокруг этой функции. scipy.spatial.ConvexHull(boundary_points) дает мне краевые точки выпуклой оболочки, и именно этот полигон корпуса теперь я хочу превратить в маску.

ответ

4

poly должен быть список кортежей или сплющенный список. По какой-то причине массивы numpy обрабатываются плохо. Вы можете преобразовать многоугольник в массив numpy с poly.ravel().tolist() или с list(map(tuple, poly)).

+0

спасибо, что делает! – flotzilla

+0

Мои числа полигонов в плавающих типах, что я должен делать? –

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