gpt4 book ai didi

python - mayavi中如何直接设置RGB/RGBA颜色

转载 作者:太空宇宙 更新时间:2023-11-04 10:42:53 25 4
gpt4 key购买 nike

我有一个带有多个顶点的 mayavi 对象,我想直接为这些顶点设置 RGB 或 RGBA 值,而不是将自己限制为带有标量的单个颜色图。如何实现?

最佳答案

据我所知,没有关于执行此操作的文档,但我找到了一种方法,只需进行最少的黑客攻击即可完成此操作。这是一个最小的示例,可能需要对不同类型的源进行一些修改:

from tvtk.api import tvtk; from mayavi import mlab; import numpy as np

x,y,z=np.random.random((3,nr_points)) #some data
colors=np.random.randint(256,size=(100,3)) #some RGB or RGBA colors

pts=mlab.points3d(x,y,z)
sc=tvtk.UnsignedCharArray()
sc.from_array(colors)

pts.mlab_source.dataset.point_data.scalars=sc
pts.mlab_source.dataset.modified()

有时您似乎还必须确保映射器指向正确的对象。这对于上面的示例来说不是必需的,但对于其他来源可能是必需的

pts.actor.mapper.input=pts.mlab_source.dataset

在某些时候,mayavi API 应该得到更好的修复,以便有一个 API 可以为所有管道功能执行此操作,但事实证明这是一组相当复杂和全面的更改,我目前还没有有时间完成。

编辑:用户 eqzx 发布了另一个问题 (Specify absolute colour for 3D points in MayaVi) 的答案,该问题可能更简单,尤其是对于某些难以使用 tvtk.UnsignedCharArray 的源类型。

他的想法是创建一个跨越整个 256x256x256 RGB 值范围的 LUT。请注意,此 LUT 因此有 16,777,216 个条目。其中,如果你想在许多 vtk 对象中使用它,一不小心可能会浪费相当多的内存。

#create direct grid as 256**3 x 4 array 
def create_8bit_rgb_lut():
xl = numpy.mgrid[0:256, 0:256, 0:256]
lut = numpy.vstack((xl[0].reshape(1, 256**3),
xl[1].reshape(1, 256**3),
xl[2].reshape(1, 256**3),
255 * numpy.ones((1, 256**3)))).T
return lut.astype('int32')

# indexing function to above grid
def rgb_2_scalar_idx(r, g, b):
return 256**2 *r + 256 * g + b

#N x 3 colors
colors = numpy.array([_.color for _ in points])

#N scalars
scalars = numpy.zeros((colors.shape[0],))

for (kp_idx, kp_c) in enumerate(colors):
scalars[kp_idx] = rgb_2_scalar_idx(kp_c[0], kp_c[1], kp_c[2])

rgb_lut = create_8bit_rgb_lut()

points_mlab = mayavi.mlab.points3d(x, y, z
keypoint_scalars,
mode = 'point')

#magic to modify lookup table
points_mlab.module_manager.scalar_lut_manager.lut._vtk_obj.SetTableRange(0, rgb_lut.shape[0])
points_mlab.module_manager.scalar_lut_manager.lut.number_of_colors = rgb_lut.shape[0]
points_mlab.module_manager.scalar_lut_manager.lut.table = rgb_lut

关于python - mayavi中如何直接设置RGB/RGBA颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19431099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com