1

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

DCM 到 numpy 数组 STL 到 numpy 数组

4

2 回答 2

0

如果您曾经做过 3D 打印,您就会知道您想要将您的 STL 对象切片,正如 Robert Hafner 所建议的那样。

首先,您需要确保您的 STL 对象与您的 Dicom 卷对齐,这可能困难也可能不困难,但这是必要的。然后将 STL 切片成 256 个切片,就好像您要对其进行 3D 打印一样,将切片输出为 256 x 256 图像,现在您将获得 256 个 256x256 像素的图像。由于它在切片之前已对齐,因此您可以将这些图像用作掩码,并在必要时对其进行阈值处理。

于 2021-06-04T19:15:26.860 回答
0

我将建议您在这里采取一种稍微不同的方法——而不是尝试在处理原始 dicom 和 STL 数据的 numpy 中完成这一切,将 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)

我从之前的评论中借用了这段代码。我想明确指出的一件事是转换为浮点数 - 查看您的示例图像,它看起来像您有整数,这意味着您从 DICOM 中丢失了大量数据,这会使您的输出变得更糟。

下一步是获取 STL 文件的平面版本,您可以将其放在图像之上。我不打算对此进行深入讨论,而是建议您为此目的使用具有“扁平化”功能的numpy-stl库。该软件包上的示例应该对完成此操作非常有帮助。

于 2021-06-02T19:24:07.527 回答