我想我遇到了一个真正的bug。似乎在colortransferfunction(CTF)接口上发生了一些非常奇怪和不直观的事情。
我将在这里描述我在电影中展示的内容,链接如下(5MB):https://drive.google.com/file/d/0B2DsQIFbCQmELTZzWVc1MDc1MGM/view?usp=sharing
动作:mlab.pipeline.volume(随便什么)。体积渲染是如何创建的并不重要。结果:卷源显示为红色。很好。
操作:用户只需单击音量传输功能,而无需对其进行太多更改。您甚至可以将它移回原来的位置。结果:体积源完全从红色变为绿色:这表明"Mayavi pipeline“窗口中的CTF与"Mayavi Scene 1”中最初使用的CTF不同。
动作:用户在不透明度传递函数上至少点击了一次,然后点击离开。然后,用户单击back。结果: CTF完全变成了这种蓝红色的淡入淡出,而不是以前漂亮的三色风格。如果用户再次弄乱OTF,更新CTF将再次更改音量!从这个绿色变成这个红紫色。
注意:不仅仅是“点击离开”和“后退”导致了CTF中的这种奇怪的变化。我最初在更改数据源时遇到了这个问题。我说有5个不同的卷。每当我说"array_src.scalar_values=my_volumes.next()“时,如果且仅当我试图在图形用户界面中手动更改CTF时,ctf就会从rgb变为蓝红色淡出。
我真的希望我们能解决这个问题。
谢谢,克里斯·斯奈德
发布于 2015-08-25 10:04:19
我有一个变通办法。这里的要点是,当您将数据切换为体绘制时,ctf和otf会留在原地,而不是进行奇怪的重新缩放和颜色更改。解决方案有两个方面。
1)确保您的所有数据量都精确扩展到0-255。您必须确保最小值和最大值分别恰好为0和255,而不仅仅是在0,255范围内。这一点很重要,因为在幕后,当您关闭array.scalar_data时,mayavi会根据您的数据重新调整ctf/otf范围。然而,它以奇怪的方式失败了。
2)不使用SceneEditor的内置编辑器(MayaviScene),而是直接公开与数据关联的Volume.view特征。对此ctf/otf编辑器的更改不会在基础数据更改时将卷从蓝-绿-红模式切换到此蓝-红淡出模式。下面是如何做的:(关键的一行是Item('vol_module',style='custom',show_label=False)
B=io.imread(bad)
G=io.imread(good)
B=B-B.min();B/=B.max();B*=255
G=G-G.min();G/=G.max();G*=255
class Vis(HasTraits):
query=Str()
scene = Instance(MlabSceneModel,())
switch_data=Button()
#You have to put vol_module here (or call add_trait later in init) for View() to see it
vol_module=Instance(Volume(),())
editor=SceneEditor(scene_class=MayaviScene)
def __init__(self,G,B):
self.G=G
self.B=B
HasTraits.__init__(self)
self.array_src=ArraySource()
self.array_src.scalar_data=G
self.G_active=True
self.scene.mayavi_scene.add_child(self.array_src)
self.volume=self.array_src.add_module(self.vol_module)
def _switch_data_fired(self):
if self.G_active:
self.array_src.scalar_data=self.B
self.G_active=False
else:
self.array_src.scalar_data=self.G
self.G_active=True
traits_view = View(
HGroup(
Item('scene',editor=editor,height=250, width=300, show_label=False),
Item('vol_module',style='custom',show_label=False),#critical
)
)
vis=Vis(G,B)
#vis=Vis(B,G)
vis.configure_traits()https://stackoverflow.com/questions/32102213
复制相似问题