Прозрачность с вокселями в VisPy
Я пытаюсь использовать python и VisPy для отображения 3D-данных из массива. Я посмотрел пример здесь, и он был чрезвычайно полезным. Я получил данные для отображения - но они не выглядят так, как я хочу.
То, как мои данные отображаются сейчас, я действительно не вижу каждого вокселя. Я могу видеть стороны фигуры, но она, честно говоря, выглядит как просто выдолбленный куб. Похоже на это. Я думаю, что это, вероятно, связано с тем, что многие значения являются отрицательными или что большинство значений являются относительно небольшими с несколькими большими выбросами.
В любом случае, я хотел бы иметь возможность устанавливать прозрачность значений по отдельности - например, положительные значения прозрачны на 70%, в то время как значения меньше -2, но больше -5, прозрачность только на 30% и оттенок зеленого. Я надеюсь, что это позволит мне увидеть фактический "объем" в отличие от того, что у меня есть сейчас.
Вот пример того, что у меня есть сейчас, на случай, если кто-то захочет увидеть (обратите внимание, сильно скопировано и вставлено из примера кода Vispy, который я связал):
# Creating volume data (returns a 100x100x100 numpy array)
volume_data = func()
# Prepare canvas
canvas = scene.SceneCanvas(keys='interactive', size=(800, 600), show=True)
# Set up a viewbox to display the image with interactive pan/zoom
view = canvas.central_widget.add_view()
# Creating and assigning camera
camera = scene.cameras.ArcballCamera(parent=view.scene, fov=60)
view.camera = camera
# Create the volume
volume = scene.visuals.Volume(volume_data, clim=(0, 1), parent=view.scene,
threshold=0.225,emulate_texture=False)
volume.cmap = 'blues'
if __name__ == '__main__':
print(__doc__)
app.run()
1 ответ
Может быть, вы можете попытаться нормализовать громкость между (0., 1.) и определить цветовую карту с несколькими уровнями прозрачности. Просто в качестве примера:
import numpy as np
from vispy import scene, app, io
from vispy.color import BaseColormap
class MultiLevels(BaseColormap):
"""Mix of green and red."""
glsl_map = """
vec4 translucent_fire(float t) {
if (t > .5 && t < .6) {
return vec4(1, 0., 0., .3);
}
else if (t >= .6) {
return vec4(0, 1., 0., 1.);
}
else {
return vec4(0., 0., 0., 0.);
}
}
"""
class Greens(BaseColormap):
"""Transparent green."""
glsl_map = """
vec4 translucent_fire(float t) {
float alpha;
if (t < .4) {
alpha = 0.;
}
else if (t >= .4 && t < .5) {
alpha = .1;
}
else {
alpha = 1.;
}
return vec4(t, pow(t, 0.5), t*t, alpha);
}
"""
# Creating volume data (returns a 100x100x100 numpy array)
volume_data = np.load(io.load_data_file('volume/stent.npz'))['arr_0'].astype(float)
volume_data /= volume_data.max() # normalize the volume between (0., 1.)
# Prepare canvas
canvas = scene.SceneCanvas(keys='interactive', size=(800, 600), show=True)
# Set up a viewbox to display the image with interactive pan/zoom
view = canvas.central_widget.add_view()
# Creating and assigning camera
camera = scene.cameras.ArcballCamera(parent=view.scene, fov=60)
view.camera = camera
# Create the volume
method = 'translucent' # 'mip'
volume = scene.visuals.Volume(volume_data, parent=view.scene, method=method)
volume.cmap = Greens() # MultiLevels()
if __name__ == '__main__':
app.run()