【问题标题】:How do I convert STL file to numpy array and format it to overlay with Dicom data?如何将 STL 文件转换为 numpy 数组并将其格式化以覆盖 Dicom 数据?
【发布时间】:2021-06-02 19:07:20
【问题描述】:

我有 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 array STL to numpy array

【问题讨论】:

    标签: python pydicom medical-imaging numpy-stl


    【解决方案1】:

    我将建议你在这里采取一种稍微不同的方法——而不是尝试在处理原始 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)
    

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

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

    【讨论】:

    • flatten 函数似乎与 dicom 文件尺寸匹配以适合 STL 文件,但我希望 STL 文件本质上是一个尺寸为 256x256x256 的 3D numpy 数组(有 256 个 dicom 文件“切片”。最终目标是将 STL 转换为与 dicom 文件切片集合具有相同尺寸的二进制掩码。您推荐的方法仍然有效吗?
    • 我的方法可行,但需要进行一些修改。 PNG 部分应保持不变(将其转换为 PNG),而不是展平您想要对其进行切片的模型。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 2014-12-18
      • 1970-01-01
      • 2015-05-08
      • 2017-10-12
      • 2019-04-18
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      相关资源
      最近更新 更多