如何将 STL 文件转换为 numpy 数组并将其格式化以覆盖 Dicom 数据?

问题描述

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

DCM to numpy array STL to numpy array

解决方法

我将建议您在这里采用稍微不同的方法 - 而不是尝试在处理原始 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 库,它具有用于此目的的“展平”功能。那个包上的例子应该对完成这个很有帮助。

,

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

首先,您需要确保您的 STL 对象与您的 Dicom 音量对齐,这可能困难也可能不困难,但很有必要。然后将 STL 切成 256 个切片,就像您要 3D 打印它一样,将切片输出为 256 x 256 图像,现在您得到 256 个 256x256 像素的图像。由于它在切片之前已对齐,因此您可以将这些图像用作蒙版,并在必要时设置阈值。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...