什么是DICOM?
DICOM(Digital Imaging and Communications in Medicine)是医学数字成像和通信的标准格式,广泛应用于医学影像领域如CT、MRI、X光等。
关键特性:
- 包含图像数据和丰富的患者元数据
- 支持多种医学影像类型
- 确保不同设备间的互操作性
- 提供图像传输和存储的标准
环境配置
使用Python处理DICOM需要安装以下库:
# 安装必要的库pip install pydicompip install matplotlibpip install numpypip install pillow
这些库分别提供以下功能:
- pydicom:读取和写入DICOM文件
- matplotlib:可视化医学图像
- numpy:处理图像像素数据
- PIL/Pillow:基础图像处理操作
加载DICOM文件
使用pydicom加载DICOM文件的基本方法:
import pydicom# 加载DICOM文件dcm_file = pydicom.dcmread('path/to/your/dicom_file.dcm')# 验证文件是否成功加载print("文件格式:", dcm_file.file_meta.TransferSyntaxUID)print("图像尺寸:", dcm_file.pixel_array.shape)
最佳实践:
- 使用
dcmread()而不是read_file()(旧版方法) - 处理大型DICOM文件时,使用
stop_before_pixels=True参数快速访问元数据 - 始终检查文件是否包含像素数据:
hasattr(dcm_file, 'pixel_array')
访问元数据
DICOM文件包含丰富的元数据,可以按以下方式访问:
# 患者信息patient_name = dcm_file.PatientNamepatient_id = dcm_file.PatientID# 检查信息study_date = dcm_file.StudyDatemodality = dcm_file.Modality # CT, MR, XR等# 图像特性rows = dcm_file.Rowscolumns = dcm_file.Columnspixel_spacing = dcm_file.PixelSpacing # 毫米/像素window_center = dcm_file.WindowCenterwindow_width = dcm_file.WindowWidth# 遍历所有元数据for elem in dcm_file: print(elem)
使用DICOM标签访问特定元素:
# 使用标签访问tag = pydicom.tag.Tag(0x0010, 0x0010) # PatientNameif tag in dcm_file: print(dcm_file[tag].value)
图像可视化
使用matplotlib可视化DICOM图像:
import matplotlib.pyplot as pltimport numpy as np# 获取像素数据pixel_data = dcm_file.pixel_array# 应用模态特定的预处理if dcm_file.Modality == 'CT': # 转换为Hounsfield单位 pixel_data = pixel_data * dcm_file.RescaleSlope + dcm_file.RescaleIntercept# 应用窗宽窗位def apply_windowing(data, window_center, window_width): window_min = window_center - window_width // 2 window_max = window_center + window_width // 2 data = np.clip(data, window_min, window_max) return data# 可视化plt.figure(figsize=(10, 10))plt.imshow(pixel_data, cmap='gray')plt.title(f'DICOM图像 - {dcm_file.Modality}')plt.axis('off')plt.show()
CT扫描示例
MRI示例
X光示例
基本图像处理
对DICOM图像进行常见处理操作:
import numpy as npfrom PIL import Image, ImageEnhance# 转换为PIL图像image = Image.fromarray(pixel_data).convert('L') # 转换为灰度图像# 调整对比度enhancer = ImageEnhance.Contrast(image)enhanced_image = enhancer.enhance(1.5) # 增加50%对比度# 调整亮度enhancer = ImageEnhance.Brightness(enhanced_image)enhanced_image = enhancer.enhance(1.2) # 增加20%亮度# 直方图均衡化def histogram_equalization(img_array): hist, bins = np.histogram(img_array.flatten(), 256, [0,256]) cdf = hist.cumsum() cdf_normalized = cdf * hist.max() / cdf.max() img_equalized = np.interp(img_array.flatten(), bins[:-1], cdf_normalized) return img_equalized.reshape(img_array.shape)# 应用直方图均衡化equalized_image = histogram_equalization(np.array(enhanced_image))
批量处理DICOM文件
处理整个DICOM系列或研究:
import osimport pydicomdef process_dicom_directory(directory): """处理目录中的所有DICOM文件""" for root, _, files in os.walk(directory): for file in files: if file.endswith('.dcm'): file_path = os.path.join(root, file) try: dcm = pydicom.dcmread(file_path) print(f"处理: {file} | 模态: {dcm.Modality} | 患者: {dcm.PatientName}") # 在这里添加处理逻辑 except Exception as e: print(f"处理 {file} 时出错: {str(e)}")# 使用示例dicom_dir = 'path/to/dicom/folder'process_dicom_directory(dicom_dir)
高级技巧:
- 使用
pydicom.filereader.read_partial处理超大文件 - 使用多线程加速批量处理
- 利用
dcmtk或gdcm处理非标准DICOM文件 - 使用
SimpleITK进行高级图像处理和分析
下一步学习
掌握DICOM处理基础后,可以探索以下方向:
三维重建
图像分割
AI辅助诊断
DICOM网络通信
影像配准
发表评论