0

我想我遇到了一个真正的错误。似乎颜色传递函数(CTF)接口发生了一些非常奇怪且肯定不直观的事情。

我将在以下链接 (5MB) 中描述我在电影中展示的内容: https ://drive.google.com/file/d/0B2DsQIFbCQmELTZzWVc1MDc1MGM/view?usp=sharing

行动:mlab.pipeline.volume(随便)。如何创建体积渲染并不重要。结果:卷源显示为红色。美好的。

行动:用户只需点击音量传输功能,而无需对其进行太多更改。您甚至可以将其移回原来的位置。结果:体积源完全从红色变为绿色:表明“Mayavi pipeline”窗口中的CTF与“Mayavi Scene 1”中最初使用的CTF不同

行动:用户至少点击过一次不透明度传递函数,然后点击离开。然后用户点击返回。结果:CTF完全变成了这种蓝红渐变色,而不是之前那种好看的三色款式。如果用户再次与 OTF 发生冲突,更新 CTF 将再次更改音量!从这种绿色到这种红紫色。

注意:不仅仅是“点击离开”和点击返回会导致 CTF 发生这种奇怪的变化。我最初在更改数据源时遇到了这个问题。我说过5个不同的卷。每当我说“array_src.scalar_values=my_volumes.next()”时,当且仅当我尝试在 GUI 中手动更改 ctf 时,CTF 才会从 rgb 变为蓝红色渐变。

我真的希望我们能解决这个问题。

谢谢,克里斯·斯奈德

4

1 回答 1

0

我有一个解决方法。这里的要点是,当您将数据切换为体积渲染时,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()
于 2015-08-25T02:04:19.253 回答