Tôi đang cố gắng để thực hiện một âm mưu 3D bao gồm một loạt các máy bay 2D thông qua một ngăn xếp RGB, như thế này:Hiển thị kết cấu 2D RGB đúng màu trong ô 3D?
Tôi biết rằng nó có thể làm điều này bằng mpl_toolkits.mplot3d
bằng cách thông qua x , y, z tọa độ và RGB (A) màu sắc của mỗi điểm ảnh để plot_surface
:
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
Đáng tiếc là điều này trở nên cực kỳ chậm nếu tôi đặt rstride=1, cstride=1
để hiển thị các kết cấu tại ful l độ phân giải.
Tôi cũng nhận thức được rằng Mayavi có thể dễ dàng xử lý hiển thị nhiều kết cấu 2D ở độ phân giải đầy đủ:
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
Tuy nhiên, vấn đề bây giờ là có dường như không có cách nào để hiển thị đúng màu RGB kết cấu bằng Mayavi - according to the docs Tôi chỉ có thể chỉ định một đơn (R, G, B)
tuple hoặc một bản đồ màu được xác định trước.
Có ai biết cách nào tốt hơn để hiển thị kết cấu 2D RGB đúng màu trong ô 3D không?
Cho đủ thời gian tôi có thể tìm ra cách làm điều này trong Vtk hoặc thậm chí là OpenGL thuần túy nếu cần thiết, nhưng tôi thực sự hy vọng rằng có các thư viện hiện có sẽ thực hiện công việc.
Hãy thử [vivis volshow] (http://code.google.com/p/visvis/wiki/functions#volshow) – cgohlke
@cgohlke cảm ơn, tôi sẽ kiểm tra nó ra –
@cgohlke wow, điều này có vẻ rất hứa hẹn thực sự! –