You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何读取文件夹中所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:15:34