Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何加速合成光线投射功能?_Python_Performance_Runtime_Raycasting_Volume Rendering - Fatal编程技术网

Python 如何加速合成光线投射功能?

Python 如何加速合成光线投射功能?,python,performance,runtime,raycasting,volume-rendering,Python,Performance,Runtime,Raycasting,Volume Rendering,我目前正在python中进行一个体绘制项目,在这个项目中,我使用合成光线投射功能生成一个图像,给定一个由体素组成的3D体。该函数(我在下面展示)工作正常,但运行时间很长。你们有关于如何使这个功能更快的技巧吗?代码是Python 3.6.8,使用各种numpy数组 def render_compositing(self, view_matrix: np.ndarray, volume: Volume, image_size: int, image: np.ndarray):

我目前正在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
def render_合成(self,view_矩阵:np.ndarray,volume:volume,image_大小:int,image:np.ndarray):
#清除图像
self.clear_image()
#U,V,视图向量。请参阅父类中的文档
u_向量=视图_矩阵[0:3]
v_向量=视图_矩阵[4:7]
视图向量=视图矩阵[8:11]
#图像的中心。图像是平方的
图像\中心=图像\大小/2
#体积中心(三维)
音量中心=[volume.dim_x/2,volume.dim_y/2,volume.dim_z/2]
#定义步长以加快循环速度
如果self.interactive\u模式为1,则步骤=2
对于范围内的i(0,图像大小,步长):
对于范围内的j(0,图像大小,步长):
sum_color=TFColor(0,0,0,0)
对于范围内的k(0,图像大小,步长):
#获取体素坐标X
体素坐标x=u向量[0]*(i-图像中心)+v向量[0]*(j-图像中心)+\
视图向量[0]*(k-图像中心)+体积中心[0]
#获取体素坐标Y
体素坐标y=u向量[1]*(i-图像中心)+v向量[1]*(j-图像中心)+\
视图向量[1]*(k-图像中心)+体积中心[1]
#获取体素坐标Y
体素坐标z=u向量[2]*(i-图像中心)+v向量[2]*(j-图像中心)+\
视图向量[2]*(k-图像中心)+体积中心[2]
颜色=self.tfunc.get\u颜色(
获取体素(体积、体素坐标x、体素坐标y、体素坐标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
红色=和颜色
绿色=和颜色
蓝色=和色
alpha=和颜色。a
#计算颜色值(0…255)
如果红色小于255,则红色=数学地板(红色*255),否则为255
如果绿色小于255,则绿色=数学地板(绿色*255),否则为255
蓝色=数学地板(蓝色*255),如果蓝色小于255,则为255
alpha=数学地板(alpha*255),如果alpha<255,则为255
#为像素i、j指定颜色
图像[(j*图像大小+i)*4]=红色
图像[(j*图像大小+i)*4+1]=绿色
图像[(j*图像大小+i)*4+2]=蓝色
图像[(j*图像大小+i)*4+3]=α

我不明白您为什么要将python用于此代码。如果你关心速度,使用着色器不是更好的方法吗

总之,在当前代码中可以完成的事情很少

  • 可以使用numpy计算体素坐标。您可以制作一个3通道2d图像,并在一次拍摄中计算整个切片(k)的x、y、z坐标
  • 通过存储第一个切片(k=0)的x、y、z坐标的图像和恒定的视图方向步骤(步骤大小),可以进一步优化上述步骤。现在,其他每一个切片都可以通过(XYZ@k=0)+k步骤大小
  • 通过将alpha值阈值设置为0.999或0.99,使用早期光线终止。这看起来不太像,但速度提升很多