不同扫描范围的PET与CT医学图像如何完成插值对齐处理
你当前使用的sitk.Resample(imagePET, ctImage)仅能将PET直接映射到CT的空间网格上,未对两者不重叠的扫描范围做逻辑对齐,因此会出现有效区域错位、范围外无效像素干扰插值效果的问题。针对体素尺寸、扫描范围均不一致的医学图像重采样对齐,标准处理流程如下:
处理步骤
- 提取图像全量空间属性:通过SimpleITK读取的PET、CT图像自带原点、体素间距、方向矩阵、数组尺寸四类物理坐标属性,处理全程不要提前转换为numpy数组,避免丢失空间信息导致错位。
- 计算公共有效扫描范围:分别计算PET、CT在X/Y/Z三个轴上的物理坐标起止值,取各轴的交集作为后续重采样的有效范围,完全排除两张图像不重叠的无效区域。
- 构造统一重采样参考网格:根据实际需求选定输出的体素间距(需匹配CT分辨率就用CT的间距,需保留PET原始分辨率就用PET的间距),结合公共范围计算对应的输出数组尺寸、输出原点。
- 执行重采样操作:分别对PET、CT执行重采样,对齐到同一参考网格,根据模态特性设置合理的填充值和插值方法。
示例代码
import SimpleITK as sitk def get_physical_range(image): # 计算单张图像的三维物理坐标起止范围 size = image.GetSize() spacing = image.GetSpacing() origin = image.GetOrigin() end_coord = [origin[i] + size[i] * spacing[i] for i in range(3)] return origin, end_coord # 1. 计算两张图像的公共物理范围 pet_origin, pet_end = get_physical_range(imagePET) ct_origin, ct_end = get_physical_range(ctImage) common_origin = [max(pet_origin[i], ct_origin[i]) for i in range(3)] common_end = [min(pet_end[i], ct_end[i]) for i in range(3)] # 2. 定义重采样输出属性,本示例以对齐CT分辨率为例 out_spacing = ctImage.GetSpacing() out_direction = ctImage.GetDirection() # 计算输出图像的数组尺寸 out_size = [ int(round((common_end[i] - common_origin[i]) / out_spacing[i])) for i in range(3) ] # 3. 初始化重采样器 resampler = sitk.ResampleImageFilter() resampler.SetOutputSpacing(out_spacing) resampler.SetOutputOrigin(common_origin) resampler.SetOutputDirection(out_direction) resampler.SetSize(out_size) resampler.SetTransform(sitk.Transform()) resampler.SetInterpolator(sitk.sitkLinear) # 4. 重采样PET,超出范围默认填充0 resampler.SetDefaultPixelValue(0) resampled_pet = resampler.Execute(imagePET) # 5. 如需将CT也裁剪到公共范围,修改填充值后重采样CT即可 resampler.SetDefaultPixelValue(-1024) resampled_ct = resampler.Execute(ctImage)
补充说明
- 若业务要求保留CT的原始数组维度无需裁剪,可直接用CT的原点、尺寸、间距、方向作为重采样的参考参数,无需计算公共范围,超出CT扫描范围的PET区域会自动填充为默认值,不会出现有效区域突出错位的问题。
- 头颈部PET-CT数据通常存在非单位的方向矩阵,重采样时必须保留方向参数,否则会出现空间层面的轴向错位。
内容的提问来源于stack exchange,提问作者Jakub Mitura
相关产品推荐
相关产品推荐

