代码之家  ›  专栏  ›  技术社区  ›  ravi

使用mayavi python为点s3d中的每个点指定颜色

  •  0
  • ravi  · 技术社区  · 7 年前

    我在三维空间中有一些点。每个点都有一种颜色,使用以下公式计算-

    //pack r/g/b into rgb
    uint8_t r=255,g=0,b=0;//示例:红色
    uint32_t r g b=(uint32_t)r<<16(uint32_t)g<<8(uint32_t)b);
    < /代码> 
    
    

    如上图所示,将RGB颜色打包为一个值。我尝试使用mayavi python来可视化这些点。请参见下面的代码段-

    从mayavi.mlab导入* 将numpy导入为np n=10 #生成随机点和颜色(仅用于调试) (x,y,z)=np.随机.随机((3,n)) 颜色=np.随机。随机(n) 节点=点s3d(x,y,z,比例因子=0.1) nodes.glyph.scale_mode='按矢量缩放' nodes.mlab_source.dataset.point_data.scalars=颜色 显示() < /代码>

    上面的代码使用随机颜色,它显示以下输出-

    但是,我希望指定颜色而不是使用随机值。请注意,每个点都有一个颜色。在这篇文章中,为了更简单,我使用下面的函数生成了相同的彩色点-

    def pack_rgb(r,g,b):
    r g b=(r<<16)+(g<<8)+b
    返回RGB
    
    颜色=[在范围(n)内为u-rgb(0,255,0)打包]
    < /代码> 
    
    

    这将生成红色点,而不是绿色点,如下所示-

    这是怎么回事?my goal is to visualize colored points in mayavi python where each point has an rgb color.

    如上图所示,将RGB颜色打包为一个值。我尝试使用mayavi python来可视化这些点。请参见下面的代码段-

    from mayavi.mlab import *
    import numpy as np
    
    N = 10
    # generate random points and colors (just for debugging)
    (x, y, z) = np.random.random((3, N))
    colors = np.random.random(N)
    
    nodes = points3d(x, y, z, scale_factor=0.1)
    nodes.glyph.scale_mode = 'scale_by_vector'
    nodes.mlab_source.dataset.point_data.scalars = colors
    
    show()
    

    上面的代码使用随机颜色,它显示以下输出-

    output with random color

    但是,我希望指定颜色而不是使用随机值。请注意,每个点都有一个颜色。在这篇文章中,为了更简单,我使用下面的函数生成了相同的彩色点-

    def pack_rgb(r, g, b):
        rgb = (r<<16) + (g<<8) + b
        return rgb
    
    colors = [pack_rgb(0, 255, 0) for _ in range(N)]
    

    这将生成红色点,而不是绿色点,如下所示-

    specified colors

    这是怎么回事?我的目标是在mayavi python中可视化彩色点,其中每个点都有一个RGB颜色。

    1 回复  |  直到 7 年前
        1
  •  2
  •   ravi    7 年前

    使用mayavi可以很容易地可视化三维空间中的点。可以单独为每个点指定RGB颜色。我们还可以为每个点设置一个比例因子。我从Mayavi社区找到了以下解决方案,我想在这里分享它-

    from mayavi import mlab
    import numpy as np
    
    n = 100 # number of points
    x, y, z = np.random.random((3, n))
    rgba = np.random.randint(0, 256, size=(n, 4), dtype=np.uint8)
    rgba[:, -1] = 255 # no transparency
    pts = mlab.pipeline.scalar_scatter(x, y, z) # plot the points
    pts.add_attribute(rgba, 'colors') # assign the colors to each point
    pts.data.point_data.set_active_scalars('colors')
    g = mlab.pipeline.glyph(pts)
    g.glyph.glyph.scale_factor = 0.1 # set scaling for all the points
    g.glyph.scale_mode = 'data_scaling_off' # make all the points same size
    
    mlab.show()
    

    请注意,上述代码需要Mayavi 4.6.1或更高版本。

    推荐文章