2013-10-13 26 views
5

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?

enter image description here

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.

+1

Hãy thử [vivis volshow] (http://code.google.com/p/visvis/wiki/functions#volshow) – cgohlke

+0

@cgohlke cảm ơn, tôi sẽ kiểm tra nó ra –

+0

@cgohlke wow, điều này có vẻ rất hứa hẹn thực sự! –

Trả lời

5

Cảm ơn bạn đã đánh giá cao việc cung cấp giải pháp làm việc bằng Mayavi/VTK - đó là thông tin hữu ích mà tôi có thể cần để thực hiện những điều phức tạp hơn trong tương lai.

Cuối cùng tôi thực sự đã chọn để đi với đề nghị cgohlke của của việc sử dụng visvis, mà hóa ra là đơn giản hơn rất nhiều để thực hiện:

import visvis as vv 
vv.use('wx') 

import numpy as np 
from matplotlib.image import imread 
from matplotlib.cbook import get_sample_data 

imgdata = imread(get_sample_data('lena.png')) 

nr, nc = imgdata.shape[:2] 
x,y = np.mgrid[:nr, :nc] 
z = np.ones((nr, nc)) 

for ii in xrange(5): 
    vv.functions.surf(x, y, z*ii*100, imgdata, aa=3) 

enter image description here

4

Tôi không biết về các thư viện khác - volshow trông gọn gàng nhưng tôi không thử nghiệm nó - nhưng bạn có thể làm điều này trong vtk.

Tôi đã làm việc này thường trong mayavi (xem How to directly set RGB/RGBA colors in mayavi) nhưng đối với một số nguồn hình ảnh nhất định có thể cấu trúc đường dẫn vtk theo cách không được thiết kế để giải quyết vấn đề này. Những nỗ lực của tôi để chuyển đổi một vtk.ImageData 2D thành màu thật bắt đầu với mlab.imshow đã được đáp ứng với sức đề kháng ở mọi bước, nhưng tôi đã quản lý nó.

Trước tiên, đây là cách tôi đã quản lý để làm điều đó trong mayavi bằng cách sử dụng mlab. Vẫn còn rất hacky và "ma thuật" -reliant ngay cả đối với các tiêu chuẩn của tôi:

from mayavi import mlab 
import numpy as np 
from tvtk.api import tvtk 

k=mlab.imshow(np.random.random((10,10)),colormap='bone') 

colors=tvtk.UnsignedCharArray() 
colors.from_array(np.random.randint(256,size=(100,3))) 
k.mlab_source.dataset.point_data.scalars=colors 
k.actor.input.point_data.scalars=colors 
#the latter set of scalars is what is actually used in the VTK pipeline in this 
#case, but if they don't play nice with the mayavi source then tvtk will 
#complain because we are circumventing the structure it expects 
k.actor.input.scalar_type='unsigned_char' 
k.actor.input.number_of_scalar_components=3 
k.image_map_to_color.lookup_table=None 

k.actor.input.modified() 
mlab.draw() 
#this draw fails. As it fails, there is an interaction here, somewhere deep in 
#tvtk, causing the ImageData to partially reset.. I have not been able to track 
#it down yet. ignore the error output 

k.actor.input.scalar_type='unsigned_char' 
k.actor.input.number_of_scalar_components=3 
#now after we reset these back to what they should be, it works 

mlab.draw() 
mlab.show() 

Nhưng trong tvtk tinh khiết nó không gần quá tệ:

import numpy as np 
from tvtk.api import tvtk 

colors=np.random.randint(256,size=(100,3)) 

an_image=tvtk.ImageData() 
an_image.number_of_scalar_components=3 
an_image.scalar_type='unsigned_char' 
an_image.point_data.scalars=tvtk.UnsignedCharArray() 
an_image.point_data.scalars.from_array(colors) 
an_image.dimensions=np.array((10,10,1)) 

an_actor=tvtk.ImageActor() 
an_actor.input=an_image 
an_actor.interpolate=False 

ren=tvtk.Renderer() 
renWin=tvtk.RenderWindow() 
renWin.add_renderer(ren) 
ren.add_actor2d(an_actor) 
iren=tvtk.RenderWindowInteractor() 
iren.render_window=renWin 
iren.interactor_style=tvtk.InteractorStyleTrackballCamera() 
renWin.render() 
iren.start() 

Tất nhiên, làm nó trong VTK được làm việc nhiều hơn . Bạn thậm chí có thể quấn nó độc đáo để nó khá hợp lý.

Tôi muốn sửa chữa mayavi để xử lý đúng cách, nhưng như bạn có thể thấy từ đoạn trích của tôi, nó không đơn giản và có thể mất một lúc.

+0

Cảm ơn rất nhiều thông tin. Cuối cùng tôi đã đi với gợi ý của @ cgohlke hóa ra rất đơn giản để thực hiện, nhưng rất hữu ích khi biết cách thiết lập màu RGBA trực tiếp bằng Mayavi/VTK - tôi có thể cần nó cho các công việc phức tạp hơn trong Tương lai. –

+0

Bạn rất hoan nghênh – aestrivex

Các vấn đề liên quan