绘制DICOM图像时遇TypeError:图像数据形状(154,600,800)无效
解决TypeError: Invalid shape (154, 600, 800) for image data问题
这个错误的核心原因是:你读取的DICOM文件不是单张2D图像,而是包含154个切片的3D体积数据,它的像素数组形状为(切片数量, 图像高度, 图像宽度),而plt.imshow()只能直接处理2D(单张灰度图)或3D(RGB/A彩色图)格式的图像数据,直接传入3D体积数组自然会报错。
下面给出两种可行的解决方式:
方式一:显示单个切片
如果只需要查看某一张切片,直接给像素数组指定切片索引即可,比如显示第0个切片或者中间位置的切片:
修改后的代码片段:
# 提取像素数据并显示单个切片 pixel_array = ds.pixel_array # 显示第0个切片(也可以换成77,对应中间位置的切片) plt.imshow(pixel_array[0], cmap='gray') plt.title(f"Slice 0 of {file}") plt.show()
方式二:遍历显示所有切片
如果需要查看全部154个切片,可以在现有循环里再加一层遍历切片的循环:
修改后的完整代码:
import os import pydicom import matplotlib.pyplot as plt os.chdir('/content/drive/MyDrive/Data') dicom_files = [f for f in os.listdir() if f.endswith('.dcm')] for file in dicom_files: ds = pydicom.dcmread(file) print(f"Patient Name: {ds.PatientName}") print(f"Patient ID: {ds.PatientID}") print(f"Study Date: {ds.StudyDate}") print(f"Study Description: {ds.StudyDescription}") pixel_array = ds.pixel_array # 遍历所有切片 for slice_idx in range(pixel_array.shape[0]): plt.imshow(pixel_array[slice_idx], cmap='gray') plt.title(f"File: {file} | Slice {slice_idx+1}/{pixel_array.shape[0]}") plt.show()
额外提示:少数3D DICOM数据会把维度顺序存为(高度, 宽度, 切片数),如果上面的索引方式显示图像异常,可以检查pixel_array.shape的输出,调整索引顺序即可。
内容的提问来源于stack exchange,提问作者Itachi
相关产品推荐
相关产品推荐

