如何将STL文件转换为numpy数组,并将其格式化为与Dicom数据重叠?

2024-04-27 03:54:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有3D对象的STL文件,我使用numpy STL包将它们转换为网格对象和numpy数组。我还使用pydicom包将DCM数据转换为numpy数组,但是STL文件的numpy数组版本的大小(numpyarray.shape)为4280,与DCM数据的256*256维不匹配。另外,每个STl文件的numpy数组的数据类型包括向量和法线值,我不知道如何解析。任何关于尺寸不匹配的见解或STL numpy数组数据类型的解释都将不胜感激,我已经附上了numpy数组形式的DCM和STL数据的图片

DCM to numpy arraySTL to numpy array


Tags: 文件to数据对象版本numpy网格数组
2条回答

如果你曾经做过3D打印,你就会知道你想把STL对象切成片,正如罗伯特·哈夫纳所建议的那样

首先,您需要确保STL对象与Dicom体积对齐,这可能很难,也可能不难,但却是必要的。然后将STL切片为256个切片,就像要进行3D打印一样,将切片输出为256 x 256个图像,现在得到256个256x256像素的图像。因为它在切片之前是对齐的,所以您可以使用这些图像作为遮罩,必要时设置阈值

我建议您在这里采用稍微不同的方法—不要试图在numpy中处理原始dicom和STL数据,而是将dicom转换为PNG,然后在其上覆盖STL

首先要创建DICOM PNG-

import numpy as np
import png
import pydicom

ds = pydicom.dcmread(path)

shape = ds.pixel_array.shape

# Convert to float to avoid overflow or underflow losses.
image_2d = ds.pixel_array.astype(float)

# Rescaling grey scale between 0-255
image_2d_scaled = (np.maximum(image_2d,0) / image_2d.max()) * 255.0

# Convert to uint
image_2d_scaled = np.uint8(image_2d_scaled)

# Write the PNG file
with open(destination, 'wb') as png_file:
    w = png.Writer(shape[1], shape[0], greyscale=True)
    w.write(png_file, image_2d_scaled)

我从aprevious comment I made借用了这段代码。我想明确指出的一件事是转换成一个浮点数——看看你的示例图像,它看起来像是整数,这意味着你从DICOM中丢失了很多数据,这会使你的输出变得更糟

下一步是获得STL文件的平面版本,您可以将其推到图像顶部。我不打算深入讨论这个问题,而是建议您使用numpy-stl库,它有一个用于此目的的“展平”函数。该软件包中的示例对于完成此任务应该非常有帮助

相关问题 更多 >