如何读取文件夹中所有DICOM文件并判断矢状/冠状视图存在性
修改后的DICOM文件处理代码
import pydicom import numpy as np import matplotlib.pyplot as plt import sys import glob import os # 新增:用于路径拼接 # 加载DICOM文件 files = [] if len(sys.argv) < 2: print("请传入目标DICOM文件夹路径作为命令行参数") sys.exit(1) folder_path = sys.argv[1] print(f"读取文件夹: {folder_path}") # 匹配文件夹下所有DICOM文件 for fname in glob.glob(os.path.join(folder_path, '*.dcm'), recursive=False): print(f"加载文件: {fname}") files.append(pydicom.dcmread(fname)) print(f"总文件数: {len(files)}") # 跳过无SliceLocation的文件(如定位图) slices = [] skipcount = 0 for f in files: if hasattr(f, 'SliceLocation'): slices.append(f) else: skipcount += 1 print(f"跳过无SliceLocation的文件数: {skipcount}") if not slices: print("没有可用的DICOM切片数据") sys.exit(1) # 按SliceLocation排序切片 slices = sorted(slices, key=lambda s: s.SliceLocation) # 计算各视图的宽高比,增加除以0判断避免报错 ps = slices[0].PixelSpacing ss = slices[0].SliceThickness ax_aspect = ps[1] / ps[0] if ps[0] != 0 else 0 sag_aspect = ps[1] / ss if ss != 0 else 0 cor_aspect = ss / ps[0] if ps[0] != 0 else 0 # 检查矢状、冠状视图可用性并打印提示 if sag_aspect == 0: print("提示:不存在可用的矢状视图(SliceThickness为0或PixelSpacing异常)") if cor_aspect == 0: print("提示:不存在可用的冠状视图(PixelSpacing为0或SliceThickness异常)") # 创建3D图像数组 img_shape = list(slices[0].pixel_array.shape) img_shape.append(len(slices)) img3d = np.zeros(img_shape) # 填充3D数组 for i, s in enumerate(slices): img2d = s.pixel_array img3d[:, :, i] = img2d # 绘制三个正交视图 print(f"3D图像形状: {img3d.shape}") fig = plt.figure(figsize=(10, 8)) # 横轴视图 a1 = plt.subplot(2, 2, 1) plt.imshow(img3d[:, :, img_shape[2]//2], cmap='gray') a1.set_title("横轴视图") a1.set_aspect(ax_aspect) # 矢状视图:仅当宽高比有效时绘制 a2 = plt.subplot(2, 2, 2) if sag_aspect != 0: plt.imshow(img3d[:, img_shape[1]//2, :], cmap='gray') a2.set_title("矢状视图") a2.set_aspect(sag_aspect) else: plt.text(0.5, 0.5, "无可用矢状视图", ha='center', va='center', transform=a2.transAxes) a2.set_title("矢状视图(不可用)") # 冠状视图:仅当宽高比有效时绘制 a3 = plt.subplot(2, 2, 3) if cor_aspect != 0: plt.imshow(img3d[img_shape[0]//2, :, :].T, cmap='gray') a3.set_title("冠状视图") a3.set_aspect(cor_aspect) else: plt.text(0.5, 0.5, "无可用冠状视图", ha='center', va='center', transform=a3.transAxes) a3.set_title("冠状视图(不可用)") plt.tight_layout() plt.show()
关键改动说明
1. 读取指定文件夹所有DICOM文件
- 新增
os模块,用os.path.join拼接路径,兼容不同操作系统的路径格式 - 替换固定文件路径为命令行参数
sys.argv[1],运行时通过python script.py /path/to/dicom/folder传入目标文件夹 - 使用
glob.glob(os.path.join(folder_path, '*.dcm'))匹配文件夹下所有.dcm文件 - 增加参数检查,如果未传入文件夹路径则提示并退出
2. 矢状/冠状视图有效性检查
- 计算宽高比时增加除以0的判断,避免运行时报错
- 当
sag_aspect或cor_aspect为0时,打印明确的提示信息 - 绘图时根据宽高比有效性决定是否绘制对应视图:若无效则在子图中显示“无可用视图”的文本提示,提升可读性
内容的提问来源于stack exchange,提问作者Med FutureXAI
相关产品推荐
相关产品推荐

