【发布时间】:2013-10-21 09:48:38
【问题描述】:
我正在尝试制作一个 3D 图,该图由一系列通过 RGB 堆栈的 2D 平面组成,如下所示:
我知道可以通过将每个像素的 x、y、z 坐标和 RGB(A) 颜色传递给plot_surface 来使用mpl_toolkits.mplot3d 来做到这一点:
import numpy as np
from matplotlib import pyplot as pp
from mpl_toolkits.mplot3d.axes3d import Axes3D
def plot_stack_slices(rgbstack, scale=(1., 1., 1.), z_interval=10.):
fig, ax = pp.subplots(1,1,subplot_kw={'projection':'3d'})
ax.invert_zaxis()
ax.hold(True)
sx, sy, sz = scale
nz, ny, nx, nc = rgbstack.shape
stack_xyz = np.mgrid[:nx*sx:nx*1j, :ny*sy:ny*1j, :nz*sz:nz*1j]
slices = rgbstack[::-z_interval]
slice_xyz = np.rollaxis(stack_xyz, 3, 0)[::-z_interval]
surflist = []
for (img,xyz) in zip(slices, slice_xyz):
x, y, z = xyz
s = ax.plot_surface(x, y, z, facecolors=img**0.75,
rstride=50, cstride=50)
surflist.append(s)
return fig, ax, surflist
不幸的是,如果我设置rstride=1, cstride=1 以便以全分辨率显示纹理,这将变得非常缓慢。
我还知道Mayavi 可以轻松处理以全分辨率显示多个 2D 纹理:
from mayavi import mlab
def plot_stack_slices2(stack, scale=(1., 1., 20.), z_interval=10.):
mfig = mlab.figure(bgcolor=(1,)*3)
sx, sy, sz = scale
nz, ny, nx = stack.shape
slices = stack[::-z_interval]
slice_z = np.linspace(0,nz*sz,nz)[::z_interval]
surflist = []
for (img,z) in zip(slices, slice_z):
im = mlab.imshow(img.T, colormap='gray', figure=mfig)
im.actor.scale = [sx,sy,sz]
im.actor.position = [0, 0, z]
surflist.append(z)
return fig, surflist
但是,现在的问题是似乎没有任何方法可以使用 Mayavi 显示真彩色 RGB 纹理 - according to the docs 我只能指定单个 (R, G, B) 元组或预定义的颜色图。
有人知道在 3D 图中显示真彩色 2D RGB 纹理的更好方法吗?
如果有足够的时间,我可能会弄清楚如何在 Vtk 甚至纯 OpenGL 中做到这一点(如果需要),但我真的希望有现有的库可以完成这项工作。
【问题讨论】:
-
@cgohlke 谢谢,我去看看
-
@cgohlke 哇,这看起来确实很有前途!
-
您是否尝试过使用
.pcolor绘制它们?请参阅:stackoverflow.com/questions/14355876/… 不过你需要大量内存! -
@RutgerKassies 实际上是否可以使用
pcolor()为每个像素指定 RGB(A) 值?我尝试将一组数组作为C传递,并将RGB 值的元组作为facecolors=传递,但没有运气。甚至绘制单个平面也非常很慢,所以我怀疑 OpenGL 后端是要走的路,很容易看到。
标签: python 3d matplotlib textures mayavi