2013-10-13 31 views
5

私はこのように、RGBのスタックを2次元平面のシリーズで構成された3Dプロットを作成しようとしている:3Dプロットにトゥルーカラーの2D RGBテクスチャを表示しますか?

enter image description here

私はそれがXを渡すことでmpl_toolkits.mplot3dを使用してこれを行うことが可能だということを知っていますplot_surfaceに、Y、Z座標と各画素のRGB(A)色:

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 

残念ながら、これはIがFULにテクスチャを表示するために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 

しかし、問題は今トゥルーカラーRGBを表示するどのような方法があるようには思えないということですMayaviを使ったテクスチャ - according to the docsタプルを1つだけ指定することも、あらかじめ定義されたカラーマップを指定することもできます。

3Dプロットにトゥルーカラーの2D RGBテクスチャを表示するにはどうすればよいでしょうか?

十分な時間があれば、Vtkや純粋なOpenGLでもこれをどうやってやるのか分かりますが、実際には既存のライブラリが存在することを期待しています。

+1

(HTTP [vivis volshow]試してみてください/ /code.google.com/p/visvis/wiki/functions#volshow) – cgohlke

+0

@cgohlkeありがとう、私はそれをチェックします –

+0

@cgohlkeうわー、これは本当に非常に有望に見えます! –

答えて

5

Mayavi/VTKを使用したワーキングソリューションを提供してくれたaestrivexに大きな感謝をします。将来的にはもっと複雑なことをするために必要な役に立つ情報です。実装するずっと簡単であることが判明し、私は実際にvisvisを使用してのcgohlkeの提案で行くことを選んだ最後に

、:

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

私は他のライブラリについて知りません - volshowはきちんとしていますが、私はそれをテストしませんでしたが、あなたはvtkでこれを行うことができます。

私はmayavi(How to directly set RGB/RGBA colors in mayaviを参照)でこれを一般的に行っていますが、mayaviはvtkパイプラインをこれを扱うようには設計されていない方法で構築しています。 mlab.imshowで始まる2D vtk.ImageDataをトゥルーカラーに変換しようとする私の努力は、すべてのステップで抵抗がありましたが、私はそれを管理しました。

まず、私はmlabを使ってmayaviでそれをやっています。これはあまりにもハックであっても、私の標準のための「魔法」-reliant:

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() 

しかし、純粋なtvtkにそれはほとんどそう悪くはない:もちろん

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() 

、VTKでより多くの仕事を、それをされてやって。あなたはこれをうまく包むことができて、それはかなり妥当であるかもしれません。

これを正しく処理するためにmayaviを修正したいのですが、私のスニペットからわかるように、それは簡単ではなく、しばらく時間がかかります。

+0

情報ありがとうございました。結局のところ、@ cgohlkeの提案は実装がずっと簡単であることが判明しましたが、Mayavi/VTKを使ってRGBAカラーを直接設定する方法を知ることは非常に便利です。未来。 –

+0

あなたは大歓迎です – aestrivex

関連する問題