SciPy Créer Polygone 2D Masque
J'ai besoin de créer un numpy tableau 2D qui représente un masque binaire d'un polygone, en utilisant la norme paquets Python.
- d'entrée: polygone de sommets, les dimensions de l'image
- de sortie: masque binaire de polygone (numpy tableau 2D)
(Contexte plus large: je veux obtenir la distance de transformation de ce polygone à l'aide de scipy.ndimage.la morphologie.distance_transform_edt.)
Quelqu'un peut me montrer comment faire cela?
Vous devez vous connecter pour publier un commentaire.
La réponse s'avère être assez simple:
numpy.array(img)
de conversion bien pour bivalue images. Le haut du tableau contient 8 petits sous-images (1 / 8ème attendus de la taille du masque, avec les 7 autres / 8ths du tableau rempli d'ordures. Peut-être que la conversion ne pas décompresser les données binaires correctement?Un peu plus direct alternative à @Anil réponse, matplotlib a
matplotlib.nxutils.points_inside_poly
qui peut être utilisé pour rapidement pixellisation de l'arbitraire d'un polygone. E. g.Qui donne (un booléen tableau numpy):
Vous devriez être en mesure de passer
grid
à l'un des scipy.ndimage.la morphologie des fonctions tout à fait bien.M = numpy.reshape(list(img.getdata()), (height, width)))
comme vous le mentionnez dans votre commentaire ci-dessus.numpy.array(img)
fait la même chose exacte beaucoup, beaucoup plus efficacement.PIL
approche est ~ 70 fois plus rapide que lamatplotlib
version!!!Une mise à jour sur son commentaire.
Matplotlib API a changé depuis que le commentaire a été posté, et maintenant, vous devez utiliser une méthode fournie par un sous-module
matplotlib.path
.De travail code est ci-dessous.
contains_points
. Pourriez-vous m'aider à comprendre cela?Vous pouvez essayer d'utiliser python l'Image de la Bibliothèque, PIL. D'abord l'initialisation de la toile. Ensuite, vous créez un objet de dessin, et commencer à faire des lignes. C'est en supposant que le polygone réside dans R^2, et que le sommet de la liste de l'entrée sont dans le bon ordre.
Entrée = [(x1, y1), (x2, y2), ..., (xn, yn)] , (largeur, hauteur)
Est-ce ce que vous recherchez, ou avez-vous été en demandant quelque chose de différent?
Un peu d'alternative à @Yusuke N. réponse en utilisant
matplotlib.path
, tout aussi efficace que celui parfrom PIL import Image, ImageDraw
(pas besoin d'installerPillow
, ,pas besoin de considérerinteger
oufloat
. utile moi, Ha?)de travail code est ci-dessous:
Et de l'image résultat est ci-dessous, où zone sombre est
False
, lumineux estTrue
.