通过使用图像平面小部件融合两个体积,同时渲染两个体积

时间:2019-05-03 03:48:17

标签: python-3.x numpy mayavi mayavi.mlab

我正在尝试在mayavi中可视化一些3D标量数据。我可以通过使用图像平面小部件来单独显示数据。我的目标是混合两个相同大小和间距的不同标量体积,并使用图像平面小部件显示它们。

我已经尝试过使用图像平面小部件。更改ipw的不透明度但无济于事,mayavi而不是将两个立方体混合在一起,将它们分别对待。

import dask.array as da
import numpy as np
import util 
import matplotlib.pyplot as plt
import scipy
from mayavi import mlab

in_path = '/home/user/Desktop/Attribute_Extract_v_0.1/small_vol.hdf5'
in_path_2 = '/home/user/Desktop/Attribute_Extract_v_0.1/anu_malik.hdf5'

data = util.read(in_path)
data_2 = util.read(in_path_2)

shaped_data_2 = np.array(data_2)
shaped_data = np.array(data)
print(shaped_data.shape)


vm = np.percentile(shaped_data,99)
vm2 = np.percentile(shaped_data_2,99)

vm_3 = np.percentile(shaped_data_2,20)
vm_4 = np.percentile(shaped_data_2,80)

#Use mayavi to plot the 3D seismic cube with xline , inline and , Timeslice 

source = mlab.pipeline.scalar_field(shaped_data)
source_2 = mlab.pipeline.scalar_field(shaped_data_2)
source.spacing = [1, 1, -1]
source_2.spacing = [1, 1, -1]

vol = mlab.pipeline.volume(source_2, vmin=vm_3, vmax=vm_4)

for axis in ['x', 'y',  'z']:


    plane = mlab.pipeline.image_plane_widget(source_2, 
                                    plane_orientation='{}_axes'.format(axis),
                                    slice_index=100, colormap='Spectral',opacity=0.2,  vmin=-vm2, vmax=vm2 )

    plane_2 = mlab.pipeline.image_plane_widget(source, 
                                    plane_orientation='{}_axes'.format(axis),
                                    slice_index=100, colormap='seismic',opacity=0.5,  vmin=-vm, vmax=vm )
    # Flip colormap. you can choose to ignore
    plane.module_manager.scalar_lut_manager.reverse_lut = True




mlab.outline()
mlab.show()

结果:results two different volumes not blended

我希望将这两个体积混合在一起,并且只有一个ipw可见,有什么方法可以实现它。

slice_index相同: enter image description here

1 个答案:

答案 0 :(得分:0)

我认为您忘记为每个数据集和每个轴更新slice_index。查看您的图,两个XY平面都绘制在同一位置,但XZ和YZ并非如此。这可能意味着,在给定平面方向的情况下,slice_index不能代表两个数据集的相同空间位置。

现在,假设您已解决此问题,并且两组image_plane_widget完全重叠,那么您实际上如何融合它们并能够同时区分它们呢?不透明度可能是这里的唯一选择,您可能要使用plane_opacity。另一种选择是绘制一个当前的数据集,然后在第二个数据集的顶部绘制有意义的contours

编辑:我无法将任何不透明度应用于volume_slice或image_plane_widget。但是,它似乎可以与scalar_cut_plane一起使用。不幸的是,飞机位置的设置方式不同。

scp = mlab.pipeline.scalar_cut_plane(
    mlab.pipeline.scalar_field(data), plane_orientation='y_axes', opacity=0.5)
scp.implicit_plane.widget.origin = np.array([X, Y , Z])
scp.implicit_plane.widget.enabled = False