医学影像处理是医疗AI、临床诊断辅助等领域的核心技术,Python凭借丰富的生态库成为该领域的主流开发语言,其中SimpleITK是专门用于医学影像处理的强大工具库,支持多种常见医学影像格式的读写与处理。

SimpleITK环境安装
在使用SimpleITK之前需要先完成环境配置,推荐使用pip命令直接安装,执行以下命令即可完成安装:
pip install SimpleITK
如果需要同时支持影像显示功能,可以额外安装itkwidgets库,方便在Jupyter环境中可视化医学影像:
pip install itkwidgets
医学影像读取与基本信息获取
SimpleITK支持读取DICOM、NIfTI、NRRD等多种医学影像格式,读取后的影像对象包含尺寸、像素间距、方向等核心元数据。以下是读取单张DICOM影像并获取基本信息的示例代码:
import SimpleITK as sitk
# 读取DICOM影像,传入DICOM文件所在路径
image = sitk.ReadImage("path/to/dicom/file.dcm")
# 获取影像尺寸,返回值为(x,y,z)三个维度的像素数量
size = image.GetSize()
# 获取像素间距,返回值为(x,y,z)三个维度的物理间距,单位通常为毫米
spacing = image.GetSpacing()
# 获取影像方向矩阵
direction = image.GetDirection()
# 获取原点坐标
origin = image.GetOrigin()
print(f"影像尺寸: {size}")
print(f"像素间距: {spacing}")
print(f"影像方向: {direction}")
print(f"原点坐标: {origin}")
医学影像预处理常用操作
影像重采样
不同医学影像的像素间距可能不一致,重采样可以将所有影像统一到相同的物理分辨率,方便后续处理。以下是将影像重采样到指定间距的示例代码:
import SimpleITK as sitk
def resample_image(image, new_spacing=(1.0, 1.0, 1.0)):
# 获取原始影像的尺寸和间距
original_size = image.GetSize()
original_spacing = image.GetSpacing()
# 计算重采样后的新尺寸
new_size = [
int(original_size[i] * original_spacing[i] / new_spacing[i])
for i in range(len(original_size))
]
# 创建重采样器
resampler = sitk.ResampleImageFilter()
resampler.SetOutputSpacing(new_spacing)
resampler.SetOutputOrigin(image.GetOrigin())
resampler.SetOutputDirection(image.GetDirection())
resampler.SetSize(new_size)
# 设置插值方式,线性插值适合大部分医学影像
resampler.SetInterpolator(sitk.sitkLinear)
# 执行重采样
resampled_image = resampler.Execute(image)
return resampled_image
# 使用示例
image = sitk.ReadImage("path/to/image.nii")
resampled_img = resample_image(image, new_spacing=(1.0, 1.0, 1.0))
影像灰度归一化
灰度归一化可以消除不同影像之间的灰度差异,提升后续模型的训练效果,以下是将影像灰度归一化到0-1区间的示例:
import SimpleITK as sitk
import numpy as np
def normalize_image(image):
# 将SimpleITK影像转换为numpy数组
img_array = sitk.GetArrayFromImage(image)
# 计算最小值和最大值
min_val = np.min(img_array)
max_val = np.max(img_array)
# 归一化到0-1区间
normalized_array = (img_array - min_val) / (max_val - min_val + 1e-8)
# 将numpy数组转换回SimpleITK影像
normalized_image = sitk.GetImageFromArray(normalized_array)
# 保留原始影像的元数据
normalized_image.SetSpacing(image.GetSpacing())
normalized_image.SetOrigin(image.GetOrigin())
normalized_image.SetDirection(image.GetDirection())
return normalized_image
# 使用示例
image = sitk.ReadImage("path/to/image.dcm")
normalized_img = normalize_image(image)
医学影像保存
处理完成的医学影像可以保存为指定格式,SimpleITK支持直接写入多种常见格式,示例代码如下:
import SimpleITK as sitk
# 读取影像
image = sitk.ReadImage("path/to/input/image.nii")
# 处理影像(此处省略处理逻辑)
processed_image = image
# 保存为NIfTI格式
sitk.WriteImage(processed_image, "path/to/output/processed_image.nii")
# 也可以保存为DICOM序列,需要传入输出目录路径
sitk.WriteImage(processed_image, "path/to/output/dicom_dir/")
常见问题说明
- 读取DICOM序列时,需要传入DICOM文件所在的目录路径,SimpleITK会自动读取目录下的所有DICOM文件并拼接为三维影像
- 处理三维医学影像时,numpy数组的维度顺序是(z,y,x),和SimpleITK影像的(x,y,z)顺序不同,转换时需要注意维度对应
- 如果处理的是CT影像,通常还需要进行窗宽窗位调整,SimpleITK提供了
sitk.IntensityWindowing函数可以实现该功能