0

我正在尝试在 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()

结果 :结果两个不同的体积没有混合

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

相同的 slice_index : 在此处输入图像描述

4

1 回答 1

0

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

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

编辑:我无法将任何不透明度应用于 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
于 2019-05-03T04:55:00.273 回答