Gráfico de superficie a partir de imagen con valor de umbral

Aug 19 2020

Quiero hacer un gráfico de superficie a partir de una matriz bidimensional, donde se almacenan los valores z (similar a una imagen donde se dan los valores de píxeles).

Mis datos son una matriz de 512x512 como:

Z
Out[85]: 
array([[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.]])

Los valores de interés están en la parte central de la imagen.

Imagen donde solo la región circular central se trazará como un gráfico de superficie

Hice la trama de superficie con:

X = np.arange(1, 513)
Y = np.arange(1, 513)
X, Y = np.meshgrid(X, Y)
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X, Y, Z, vmin=0.01)
plt.show()

El resultado es:

Imagen resultante sin enmascaramiento ni umbralización

Aparte de un mal estilo, solo quiero trazar la región central circular y no trazar la región cuadrada exterior donde todos los valores son cero.

¿Cómo puedo dar un umbral o una máscara a los valores? ¿O hay un enfoque mucho mejor? Realmente agradecería un ejemplo ya que soy bastante nuevo en python/numpy ect.

¡Muchos gracias!

Respuestas

2 P.Leibner Aug 19 2020 at 15:11

Una forma de suprimir el trazado de ceros en su gráfico de superficie es reemplazar los ceros (o todos los valores que no desea trazar) en su Z-Array con nans como este:

Z[Z==0]=np.nan

Esto debería darle la trama deseada.