2011-07-08 112 views
7

我有一个三维数组,代表笛卡尔空间的密度值。要获得2D图像,我只需使用sum(array,2)对其中一个轴进行求和,然后使用matplotlib函数imshow(array2D)获取2D图像。2D块系列的3D数组在numpy

我想要做的是使用imshow()来一次只显示3D数组的一个切片,这样我就可以通过3D数组“页面”查看图像的不同点。

切片命令很简单:array[:,:,x]但我看不出每次切片至少要显示一个切片。除了每次手动更改程序文件外,有没有人有建议?这可以通过交互方式完成吗?

回答

3

其实我写的代码,这样做,我认为正是你所寻找的,看看这可以帮助:

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) 

只需拨打您的3D阵列上的显示功能,我会告诉它显示什么片。只要您选择了情节,您就可以用箭头键逐步切片。

请注意,这需要具有形状(x,y,z)的数组,例如可以使用np.dstack((im1,im2,...))从一系列2d数组中获得这样的数组。

Interactive matplotlib plot with two sliders请参阅使用GUI滑块做

+1

感谢这个的代码示例,我一直在寻找这样的事情了。每次你调用'imshow'时,它会将另一个图像叠加到一堆图像上,在执行'imshow'之前,你可能想要做一些像'self.ax.images.pop()',以避免内存泄漏。 –

+0

嘿酷,我怀疑有内存泄漏,我会给ax.images.pop()一试 – triplepoint217