什么是DICOM?
DICOM(Digital Imaging and Communications in Medicine)是医学数字成像和通信的标准格式,广泛应用于医学影像领域如CT、MRI、X光等。
关键特性:
- 包含图像数据和丰富的患者元数据
- 支持多种医学影像类型
- 确保不同设备间的互操作性
- 提供图像传输和存储的标准
环境配置
使用Python处理DICOM需要安装以下库:
# 安装必要的库
pip install pydicom
pip install matplotlib
pip install numpy
pip 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.PatientName
patient_id = dcm_file.PatientID
# 检查信息
study_date = dcm_file.StudyDate
modality = dcm_file.Modality # CT, MR, XR等
# 图像特性
rows = dcm_file.Rows
columns = dcm_file.Columns
pixel_spacing = dcm_file.PixelSpacing # 毫米/像素
window_center = dcm_file.WindowCenter
window_width = dcm_file.WindowWidth
# 遍历所有元数据
for elem in dcm_file:
print(elem)
使用DICOM标签访问特定元素:
# 使用标签访问
tag = pydicom.tag.Tag(0x0010, 0x0010) # PatientName
if tag in dcm_file:
print(dcm_file[tag].value)
图像可视化
使用matplotlib可视化DICOM图像:
import matplotlib.pyplot as plt
import 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 np
from 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 os
import pydicom
def 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网络通信
影像配准
发表评论