Je travaille en Python2.7 avec des tableaux 3D numpy, et j'essaie de ne récupérer que les pixels qui tombent sur un disque 2D incliné.Masquage d'un tableau numpy 3D avec un disque incliné
Voici mon code pour tracer la frontière du disque (= un cercle) Je suis intéressé par
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#creating a 3d numpy array (empty in this example, but will represent a binary 3D image in my application)
space=np.zeros((40,40,20))
r = 8 #radius of the circle
theta = np.pi/4 # "tilt" of the circle
phirange = np.linspace(0, 2 * np.pi) #to make a full circle
#center of the circle
center=[20,20,10]
#computing the values of the circle in spherical coordinates and converting them
#back to cartesian
for phi in phirange:
x = r * np.cos(theta) * np.cos(phi) + center[0]
y= r*np.sin(phi) + center[1]
z= r*np.sin(theta)* np.cos(phi) + center[2]
space[int(round(x)),int(round(y)),int(round(z))]=1
x,y,z = space.nonzero()
#plotting
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, zdir='z', c= 'red')
plt.show()
L'intrigue donne la figure suivante:
qui est un bon début, mais maintenant je veux un moyen de récupérer uniquement les valeurs des pixels de space
qui se trouvent dans le disque défini par le cercle: ceux de la zone rose dans l'image suivante (dans mon application, space
sera être une image binaire 3D, ici il est numpy.zeros() juste pour être en mesure de tracer et vous montrer le disque que je veux):
Comment dois-je procede? Je suppose qu'il y a un certain nombre de masques impliqués, je comprends comment vous le feriez en 2D (comme this question) mais j'ai du mal à l'appliquer en 3D.
Que voulez-vous dire par "tomber"? Si un pixel est un point, il n'y a aucune garantie qu'il coupe l'avion du tout, encore moins à l'intérieur d'un cercle. Voulez-vous plutôt regarder à l'intérieur d'un cylindre de hauteur 1? – Eric
Oui, je suis conscient de cela, travailler avec l'approximation est bon pour cette application, d'où le round() dans le code que je montre: les points sur la figure sont approximativement sur un cercle. Je suppose que vous pourriez dire que cela équivaut à chercher des points dans un cylindre haute de 1pixel, oui. – Soltius