Numpy: Sélection des formes abritrary en fonction des angles de forme

voix
1

Je me sers de l' indexation numpy pendant un certain temps maintenant. Mais je ne l' ai jamais eu à sélectionner des formes de base telles que des rectangles ou des disques

Cependant, je dois maintenant être en mesure de sélectionner des formes plus arbitraires et je ne peux pas trouver un bon moyen de le faire. Idéalement, je voudrais être en mesure de donner une liste des coins et pour tous les indices contenus dans les coins à sélectionner. On peut supposer la forme donnée est convexe

Par exemple, étant donné un tableau rempli de zéros de forme (10, 10), en essayant de définir les valeurs dans les coins ((2,2), (6,3), (4,8) et (7,9) ) à 1 ce renverrait un masque comme tel

  [[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 1., 1., 1., 0., 0., 0., 0., 0.],
   [0., 0., 1., 1., 1., 1., 0., 0., 0., 0.],
   [0., 0., 1., 1., 1., 1., 1., 1., 1., 0.],
   [0., 0., 0., 1., 1., 1., 1., 1., 1., 0.],
   [0., 0., 0., 1., 1., 1., 1., 1., 1., 1.],
   [0., 0., 0., 0., 0., 0., 1., 1., 1., 1.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]

Maintenant, l'un des problèmes est qu'il n'y a généralement pas de solution unique à ce problème, mais en prenant plausible est assez bon pour moi. Je ne peux pas penser à une façon de le faire en utilisant numpy cependant, comme seulement slicings de base et des équations mathématiques claires semblent être pris en charge.

Quelqu'un at-il jamais rencontré un tel défi? Est-ce que je dois recourir à python plus traditionnel pour les boucles?

Créé 09/10/2019 à 12:51
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
2

Certes une solution laid, mais que diriez-vous générer un masque binaire pour la sélection de votre polygone via OpenCV et en utilisant celui-là?

import cv2
import numpy as np

corners = np.asarray([(2,2), (6,3), (4,8), (7,9)])

target = np.zeros([10,10])
mask = cv2.fillPoly(np.zeros_like(target, dtype=np.uint8), [corners], 255).astype(bool)

target[mask] = 1

génère:

>>> target
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 1., 1., 1., 0., 0., 0., 0., 0.],
       [0., 0., 0., 1., 1., 1., 1., 0., 0., 0.],
       [0., 0., 0., 1., 1., 1., 1., 0., 0., 0.],
       [0., 0., 0., 0., 1., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 1., 1., 0., 0., 0.],
       [0., 0., 0., 0., 1., 1., 1., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1., 1., 0., 0.]], dtype=float32)

Notez : J'utilise les coins dans l'ordre que vous avez donné. Pour OpenCV, les points dans un polygone sont interprétés dans l'ordre ( d' où la différence de forme entre ma sortie et le vôtre). Réorganiser les coins en conséquence pour obtenir exactement la forme dont vous avez besoin (par exemple, dans le sens horaire).

Note (2) : Je suis l' interprétation de vos angles que (x, y), non pas comme (ligne, colonne), étant donné qu'il n'a pas été spécifié dans la convention des utilisations de question et OpenCV (x, y) pour les points (alors que les utilisations numpy (ligne, colonne)).


Pour générer la sortie que vous voulez, échanger les coordonnées du coin et les réorganiser comme suit:

corners = np.asarray([(2,2), (6,3), (7,9), (4,8) ])[:,(1,0)]

Avec ce (et le code ci-dessus) vous obtenez:

>>> target
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 1., 1., 0., 0., 0., 0., 0., 0.],
       [0., 0., 1., 1., 1., 1., 1., 0., 0., 0.],
       [0., 0., 1., 1., 1., 1., 1., 1., 1., 0.],
       [0., 0., 0., 1., 1., 1., 1., 1., 1., 0.],
       [0., 0., 0., 1., 1., 1., 1., 1., 1., 1.],
       [0., 0., 0., 0., 0., 0., 0., 1., 1., 1.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)
Créé 09/10/2019 à 13:08
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more