python - 如何加快合成光线投射功能?
问题描述
我目前正在 python 中进行体积渲染项目,在给定由体素组成的 3D 体积时,我使用合成光线投射功能来生成图像。该函数(我在下面显示)可以正常工作,但运行时间很长。你们有关于如何使这个功能更快的提示吗?代码是 Python 3.6.8 并使用各种 numpy 数组。
def render_compositing(self, view_matrix: np.ndarray, volume: Volume, image_size: int, image: np.ndarray):
# Clear the image
self.clear_image()
# U, V, View vectors. See documentation in parent's class
u_vector = view_matrix[0:3]
v_vector = view_matrix[4:7]
view_vector = view_matrix[8:11]
# Center of the image. Image is squared
image_center = image_size / 2
# Center of the volume (3-dimensional)
volume_center = [volume.dim_x / 2, volume.dim_y / 2, volume.dim_z / 2]
# Define a step size to make the loop faster
step = 2 if self.interactive_mode else 1
for i in range(0, image_size, step):
for j in range(0, image_size, step):
sum_color = TFColor(0, 0, 0, 0)
for k in range(0, image_size, step):
# Get the voxel coordinate X
voxel_coordinate_x = u_vector[0] * (i - image_center) + v_vector[0] * (j - image_center) + \
view_vector[0] * (k - image_center) + volume_center[0]
# Get the voxel coordinate Y
voxel_coordinate_y = u_vector[1] * (i - image_center) + v_vector[1] * (j - image_center) + \
view_vector[1] * (k - image_center) + volume_center[1]
# Get the voxel coordinate Y
voxel_coordinate_z = u_vector[2] * (i - image_center) + v_vector[2] * (j - image_center) + \
view_vector[2] * (k - image_center) + volume_center[2]
color = self.tfunc.get_color(
get_voxel(volume, voxel_coordinate_x, voxel_coordinate_y, voxel_coordinate_z))
sum_color.r = color.a * color.r + (1 - color.a) * sum_color.r
sum_color.g = color.a * color.g + (1 - color.a) * sum_color.g
sum_color.b = color.a * color.b + (1 - color.a) * sum_color.b
sum_color.a = color.a + (1 - color.a) * sum_color.a
red = sum_color.r
green = sum_color.g
blue = sum_color.b
alpha = sum_color.a
# Compute the color value (0...255)
red = math.floor(red * 255) if red < 255 else 255
green = math.floor(green * 255) if green < 255 else 255
blue = math.floor(blue * 255) if blue < 255 else 255
alpha = math.floor(alpha * 255) if alpha < 255 else 255
# Assign color to the pixel i, j
image[(j * image_size + i) * 4] = red
image[(j * image_size + i) * 4 + 1] = green
image[(j * image_size + i) * 4 + 2] = blue
image[(j * image_size + i) * 4 + 3] = alpha
解决方案
我不明白你为什么要在这段代码中使用 python。如果您担心速度,使用着色器不是更好的方法吗?
无论如何,这里有几件事可以在当前代码中完成。
- 体素坐标可以使用 numpy. 您可以制作一个 3 通道 2d 图像并在一次拍摄中计算整个切片 (k) 的 x、y、z 坐标。
- 上述步骤可以通过存储与第一个切片(k=0)协调的 x、y、z 图像和恒定的 view_direction步骤(step_size)来进一步优化。现在可以通过 (XYZ@k=0) + k step_size 简单地计算其他每个切片。
- 通过将 alpha 值设置为 0.999 或 0.99 来使用早期光线终止。这看起来不多,但提供了很多速度增益。
推荐阅读
- vb.net - 使用 vb.net 创建 SOAP 请求
- highcharts - highcharts 工具提示 valueDecimals 不起作用
- ruby-on-rails - 验证对象是否在 Ruby Unicorn 进程之间共享内存?
- c# - 删除有外键的记录
- typescript - Dynamics 365 Web 资源的 Fiddler AutoResponder 错误
- angular - 数据未通过 switch case Angular 显示
- python - Django Rest Framework - Django 嵌套序列化器一对多关系
- php - 如何从 Laravel excel 2.1 获取具有单元格地址的所有单元格值?
- php - 有人可以为我解释一下这段代码吗
- r - 仅绘制小提琴图的一侧/一半