【问题标题】:2D slice series of 3D array in numpynumpy中的3D数组的2D切片系列
【发布时间】:2011-10-01 01:10:01
【问题描述】:

我有一个 3D 数组,它表示笛卡尔空间上的密度值。要获得 2D 图像,我只需使用 sum(array,2) 对其中一个轴求和,然后使用 matplotlib 函数 imshow(array2D) 来获得 2D 图像。

我想要做的是使用 imshow() 一次只显示 3D 数组的一个切片,以便我可以“翻页”浏览 3D 数组以查看图像的不同点。

切片命令很简单:array[:,:,x],但我认为没有办法至少一次显示每个切片。除了每次手动更改程序文件之外,还有其他人有什么建议吗?这可以以某种方式以交互方式完成吗?

【问题讨论】:

    标签: python image numpy matplotlib slice


    【解决方案1】:

    我实际上编写了代码来完成我认为您正在寻找的事情,看看这是否有帮助:

    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 数组上调用 show 函数,我会告诉它要显示的切片。只要您选择了绘图,就可以使用箭头键逐步浏览切片。

    注意,这需要形状为 (x, y, z) 的数组,例如,您可以使用 np.dstack((im1, im2, ...)) 从一系列二维数组中获取这样的数组。

    另请参阅Interactive matplotlib plot with two sliders 以获取使用 gui 滑块执行此操作的代码示例

    【讨论】:

    • 谢谢你,我也在找这样的东西。仅供参考,每次您调用imshow 时,它都会将另一个图像堆叠到一堆图像上,您可能需要在执行imshow 之前执行类似self.ax.images.pop() 的操作,以避免内存泄漏。
    • 嘿酷,我怀疑是内存泄漏,我试试 ax.images.pop()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2021-04-22
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多