将DICOM文件转为numpy数组后.shape仅返回(171,)的问题咨询
DICOM文件读取与图像显示问题解答
为什么numpy数组shape仅返回(171,)
你当前代码里display.append(medical_image)添加的是pydicom读取后的Dataset对象(包含DICOM元数据、像素数据等完整文件信息),并非图像的像素数组。将这些Dataset对象转为numpy数组时,数组的每个元素都是独立的文件实例,因此整体维度只有文件数量这一个维度,即(171,)。
你的想法是正确的——获取图像维度才能用Matplotlib显示
Matplotlib显示图像需要的是二维/三维像素数组,而非DICOM的文件对象。你需要修改代码,将提取出的像素数组存入列表,再转成numpy数组,这样就能得到包含图像尺寸的多维数组。
修正后的代码示例
import glob import pydicom import numpy as np import matplotlib.pyplot as plt # 用于存储图像像素数组的列表 image_arrays = [] path = "./path/*.dcm" for f in glob.iglob(path): medical_image = pydicom.dcmread(f) # 提取像素数组并转为float类型 image = medical_image.pixel_array.astype(float) # 存储像素数组而非DICOM文件对象 image_arrays.append(image) # 转换为numpy数组 image_arrays = np.array(image_arrays) # 打印数组形状,单帧DICOM会返回(171, 图像高度, 图像宽度) print(image_arrays.shape) # 用Matplotlib显示第一张图像(DICOM常用灰度色图) plt.imshow(image_arrays[0], cmap="gray") plt.axis('off') plt.show()
补充说明
- 如果你的DICOM是多帧动态序列,像素数组会是三维结构,转成numpy数组后形状会是
(171, 帧数, 图像高度, 图像宽度),显示时需要指定具体帧数(如image_arrays[0][5]表示第一个文件的第6帧)。 - 部分DICOM图像需要调整窗宽窗位才能清晰显示,基础显示可先用灰度色图,后续可根据需求添加窗宽窗位处理逻辑。
内容的提问来源于stack exchange,提问作者Guilherme de Lima Schwaikartt
相关产品推荐
相关产品推荐

