我有3D对象的STL文件,我已经使用numpy-stl包将它们转换为网格对象和numpy数组。我还使用pydicom包将DCM数据转换为numpy数组,但是STL文件的numpy数组版本的大小(numpyarray.shape)为4280,这与DCM数据的256*256维度不匹配。此外,每个STl文件的numpy数组的数据类型都包括向量和法线值,我不知道如何解析它们。任何关于维度不匹配的见解或STL numpy数组的数据类型的解释都将不胜感激,我已经附上了numpy数组形式的DCM和STL数据的图片。
发布于 2021-06-03 03:24:08
我将在这里建议您采取一种稍微不同的方法-而不是尝试在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)我从一个previous comment I made借来了这段代码。我想明确指出的一件事是转换成浮点数--看你的示例图像,它看起来像是整数,这意味着你从DICOM中丢失了大量数据,这会使你的输出变得更糟。
下一步是获取STL文件的平面版本,您可以将其放在图像的顶部。我不打算深入讨论这一点,而是建议您使用具有“扁平化”功能的numpy-stl库来实现此目的。该包中的示例应该对完成这项工作非常有帮助。
发布于 2021-06-05 03:15:27
如果你曾经做过3D打印,你就会知道你想把你的STL对象切成切片,就像Robert Hafner建议的那样。
首先,您需要确保您的STL对象与您的Dicom卷对齐,这可能很困难,也可能不困难,但却是必要的。然后将STL切成256个切片,就像你要3D打印它一样,输出256 x 256图像,现在你得到256个256 x 256像素的图像。因为它是在切片之前对齐的,所以你可以使用这些图像作为你的掩码,如果需要的话,对它们进行阈值处理。
https://stackoverflow.com/questions/67811092
复制相似问题