Python VTK: облако точек и палитра цветов

У меня есть файл, в котором: 1-й столбец - это координата x, 2-й - y, 3-й - z, а 4-й - значение, связанное с каждой точкой. Я хотел бы нанести эти точки, и каждая из них должна быть раскрашена в соответствии с 4-м столбцом. Я бы сделал это на питоне. Я использую анаконду с vtk и vtk_visualizer в Windows. У меня миллионы очков. Я нашел более быстрый способ - использовать python-vtk. Вот код, который у меня есть сейчас:

import vtk
import numpy as np

## DATA
# Generate random points w/ random RGB colors
n     = 10**5
xyz   = 100*np.random.rand(n, 3)
color = 10*np.random.rand(n, 1)
# Point size
point_size = 10

## COLORMAP
cmax = np.max(color)
cmin = np.min(color)
cmed = (cmax+cmin)/2
normalizzato = color / np.max( np.absolute(cmax), np.absolute(cmin) )
rgb = np.zeros((len(color), 3))
for i in range(0, len(color) ):
    if color[i] >= cmed:
        # Red
        rgb[i][0] = 255*normalizzato[i]
    if color[i] < cmed:
        # Blue
        rgb[i][2] = 255*normalizzato[i]

## VTK
# Create the geometry of a point (the coordinate)
points = vtk.vtkPoints()
# Create the topology of the point (a vertex)
vertices = vtk.vtkCellArray()
# Setup colors
Colors = vtk.vtkUnsignedCharArray()
Colors.SetNumberOfComponents(3)
Colors.SetName("Colors")
# Add points
for i in range(0, len(xyz)):
    p = xyz[i]
    id = points.InsertNextPoint(p)
    vertices.InsertNextCell(1)
    vertices.InsertCellPoint(id)
    Colors.InsertNextTuple3(rgb[i][0], rgb[i][1], rgb[i][2])
# Create a polydata object
point = vtk.vtkPolyData()
# Set the points and vertices we created as the geometry and topology of the polydata
point.SetPoints(points)
point.SetVerts(vertices)
point.GetPointData().SetScalars(Colors)
point.Modified()
# Visualize
mapper = vtk.vtkPolyDataMapper()
if vtk.VTK_MAJOR_VERSION <= 5:
    mapper.SetInput(point)
else:
    mapper.SetInputData(point)

## ACTOR
# Create an actor
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetPointSize(point_size)
axes = vtk.vtkAxesActor()

## RENDER
renderer = vtk.vtkRenderer()
# Add actor to the scene
renderer.AddActor(actor)
# Background
renderer.SetBackground(0.1, 0.2, 0.3)
# Reset camera
renderer.ResetCamera()
# Render window
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
# Interactor
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
# Begin interaction
renderWindow.Render()
renderWindowInteractor.Start()

Это довольно быстро. Как видите, цветовая шкала есть, но я не могу определить нужный диапазон и цвет. Любые идеи? Есть ли у вас какие-либо предложения о том, как заменить раздел ## COLORMAP и получить что-то, что ссылается на настоящую цветовую карту? Я также пытался использовать mayavi.mlab.point3d, но он очень медленный, а также vtk_visualizer вот код:

from vtk_visualizer import *
import numpy as np    
# Generate random points w/ random RGB colors
n = 10**6
xyz = np.random.rand(n, 3)
color = 10*np.random.rand(n, 1)    
## Colormap
cmax = np.max(color)
cmin = np.min(color)
cmed = (cmax+cmin)/2
normalizzato = color / np.max( np.absolute(cmax), np.absolute(cmin) )
rgb = np.zeros((len(color), 3))
for i in range(0, len(color) ):
    if color[i] >= cmed:
        # Red
        rgb[i][0] = 255*normalizzato[i]
    if color[i] < cmed:
        # Blue
        rgb[i][2] = 255*normalizzato[i]    
# Stack arrays in sequence horizontally (column wise).
pc = np.hstack([xyz,rgb])    
# Plot them
plotxyzrgb(pc)

Но он медленнее, чем vtk, и я не могу изменить размер точек, имея шкалу палитры и ось.

Спасибо


person yellowhat    schedule 24.05.2015    source источник


Ответы (1)


Я могу легко изменить размер точек, посмотрите здесь: http://docs.enoughtt.com/mayavi/mayavi/auto/mlab_helper_functions.html#mayavi.mlab.points3d

Также есть примеры с точками разного размера.

Также палитра и оси просто создаются с помощью:

from mayavi import mlab
mlab.axes()
mlab.colorbar()

Команды можно найти здесь: http://docs.engotit.com/mayavi/mayavi/auto/mlab_other_functions.html

person Singularity    schedule 26.05.2015
comment
Спасибо за ответ. Но я бы хотел использовать vtk, потому что Mayavi работает медленно. - person yellowhat; 26.05.2015
comment
Для шкалы цветов с vtk я нашел этот код: vtkSmartPointer<vtkScalarBarActor> scalarBar = vtkSmartPointer<vtkScalarBarActor>::New(); scalarBar->SetLookupTable(mapper->GetLookupTable()); scalarBar->SetTitle("Title"); scalarBar->SetNumberOfLabels(4); - person Singularity; 27.05.2015