Python numpy中3D阵列的2D切片系列
我有一个3D数组,表示笛卡尔空间上的密度值。要获得2D图像,我只需使用Python numpy中3D阵列的2D切片系列,python,image,numpy,matplotlib,slice,Python,Image,Numpy,Matplotlib,Slice,我有一个3D数组,表示笛卡尔空间上的密度值。要获得2D图像,我只需使用sum(array,2)在其中一个轴上求和,然后使用matplotlib函数imshow(array2D)获得2D图像 我想做的是使用imshow()一次只显示3D阵列的一个切片,这样我就可以在3D阵列中“翻页”以查看图像的不同点 slice命令很简单:array[:,:,x],但我认为没有办法一次至少显示一个切片。除了每次手动更改程序文件外,是否有人有其他建议?这可以以交互方式完成吗?我实际上编写了一些代码来完成我认为您需要
sum(array,2)
在其中一个轴上求和,然后使用matplotlib函数imshow(array2D)
获得2D图像
我想做的是使用imshow()
一次只显示3D阵列的一个切片,这样我就可以在3D阵列中“翻页”以查看图像的不同点
slice命令很简单:
array[:,:,x]
,但我认为没有办法一次至少显示一个切片。除了每次手动更改程序文件外,是否有人有其他建议?这可以以交互方式完成吗?我实际上编写了一些代码来完成我认为您需要的工作,看看这是否有帮助:
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,…)的2d数组中获得这样的数组
另请参见使用gui滑块执行此操作的代码示例谢谢,我也在寻找类似的东西。仅供参考,每次调用
imshow
时,它会将另一个图像堆叠到一堆图像上,在执行imshow
之前,您可能需要执行类似于self.ax.images.pop()的操作,以避免内存泄漏。嘿,酷,我怀疑内存泄漏,我将尝试ax.images.pop()