2011-07-08 13 views
7

Tengo una matriz 3D que representa los valores de densidad en el espacio cartesiano. Para obtener una imagen 2D, simplemente sumo sobre uno de los ejes usando sum(array,2) y luego uso la función matplotlib imshow(array2D) para obtener la imagen 2D.serie de división 2D de matriz 3D en numpy

Lo que quiero hacer es usar imshow() para mostrar solo una porción de la matriz 3D a la vez, de modo que pueda 'buscar' en la matriz 3D para ver diferentes puntos de la imagen.

El comando slice es simple: array[:,:,x], pero no veo forma de mostrar cada sector al mismo tiempo. ¿Alguien tiene alguna sugerencia además de cambiar manualmente el archivo del programa cada vez? ¿Se puede hacer esto de manera interactiva de alguna manera?

Respuesta

3

De hecho, me escribió código para hacer exactamente lo que creo que está buscando, a ver si esto ayuda:

import numpy as np 
import pylab 

class plotter: 
    def __init__(self, im, i=0): 
     self.im = im 
     self.i = i 
     self.vmin = im.min() 
     self.vmax = im.max() 
     self.fig = pylab.figure() 
     pylab.gray() 
     self.ax = self.fig.add_subplot(111) 
     self.draw() 
     self.fig.canvas.mpl_connect('key_press_event',self) 

    def draw(self): 
     if self.im.ndim is 2: 
      im = self.im 
     if self.im.ndim is 3: 
      im = self.im[...,self.i] 
      self.ax.set_title('image {0}'.format(self.i)) 

     pylab.show() 

     self.ax.imshow(im, vmin=self.vmin, vmax=self.vmax, interpolation=None) 


    def __call__(self, event): 
     old_i = self.i 
     if event.key=='right': 
      self.i = min(self.im.shape[2]-1, self.i+1) 
     elif event.key == 'left': 
      self.i = max(0, self.i-1) 
     if old_i != self.i: 
      self.draw() 
      self.fig.canvas.draw() 


def slice_show(im, i=0): 
    plotter(im, i) 

Sólo tiene que llamar la función de presentación en la matriz 3d, voy a decirle qué rebanada de mostrar. Puede atravesar rebanadas con las teclas de flecha siempre que tenga el trazado seleccionado.

Tenga en cuenta que esto espera matrices con forma (x, y, z), por ejemplo, puede obtener una matriz de una serie de matrices 2d con np.dstack ((im1, im2, ...)).

Ver también Interactive matplotlib plot with two sliders para un ejemplo de código de hacerlo con deslizadores GUI

+1

Gracias por esto, yo estaba buscando algo como esto también. Solo fyi, cada vez que llamas a 'imshow' apila otra imagen en un montón de imágenes, es posible que quieras hacer algo como' self.ax.images.pop() 'antes de hacer el' imshow' para evitar un pérdida de memoria. –

+0

hey cool, sospechaba una pérdida de memoria, le voy a dar ax.images.pop() un intento – triplepoint217

Cuestiones relacionadas