# -*- coding: utf-8 -*-
import os
import pydicom
import numpy as np
import matplotlib.pyplot as plt
from pydicom.errors import InvalidDicomError
def load_dicom_series(series_path):
"""
加载指定路径下的所有DICOM文件,并按照切片位置排序
参数:
series_path (str): DICOM系列所在的目录路径
返回:
list: 排序后的DICOM数据集列表
"""
# 1. 检查路径是否存在
if not os.path.exists(series_path):
raise FileNotFoundError(f"目录不存在: {series_path}")
# 2. 获取目录下所有DICOM文件
dicom_files = []
for root, _, files in os.walk(series_path):
for file in files:
file_path = os.path.join(root, file)
try:
# 3. 尝试读取DICOM文件
dataset = pydicom.dcmread(file_path)
# 4. 验证是否包含必要属性
if hasattr(dataset, 'SliceLocation'):
dicom_files.append(dataset)
else:
print(f"警告: 文件缺少SliceLocation属性,跳过: {file_path}")
except InvalidDicomError:
# 5. 跳过非DICOM文件
print(f"跳过非DICOM文件: {file_path}")
# 6. 检查是否找到DICOM文件
if not dicom_files:
raise ValueError("目录中未找到有效的DICOM文件")
# 7. 按切片位置排序
dicom_files.sort(key=lambda ds: float(ds.SliceLocation))
return dicom_files
def extract_pixel_data(dicom_series):
"""
从DICOM系列中提取像素数据并转换为3D数组
参数:
dicom_series (list): 排序后的DICOM数据集列表
返回:
tuple: (3D像素数组, 元数据字典)
"""
# 1. 创建3D数组存储所有切片
first_slice = dicom_series[0]
rows = first_slice.Rows
columns = first_slice.Columns
num_slices = len(dicom_series)
# 2. 初始化3D数组
volume = np.zeros((num_slices, rows, columns), dtype=np.int16)
# 3. 提取元数据
metadata = {
'patient_id': getattr(first_slice, 'PatientID', '未知'),
'patient_name': getattr(first_slice, 'PatientName', '未知'),
'study_date': getattr(first_slice, 'StudyDate', '未知'),
'modality': getattr(first_slice, 'Modality', '未知'),
DICOM 医学影像文件的读取、处理与可视化的例子
于 2025-07-20 08:02:44 首次发布

最低0.47元/天 解锁文章
8851

被折叠的 条评论
为什么被折叠?



