SimpleITK技术问题:如何在不改变像素间距的情况下调整图像形状
保持像素间距的CT图像形状调整方案
要在不改变像素间距、不丢失有效信息的前提下,将CT图像从原形状(66, 47, 21)(对应数组的Z,Y,X维度)调整为目标形状[64,64,16](X,Y,Z维度),核心思路是对各维度分别进行居中裁剪(原尺寸大于目标时)或背景填充(原尺寸小于目标时),全程保留原有像素的间距和有效信息。
关键前提:明确SITK的维度顺序
- SITK读取的图像,
GetSize()返回的尺寸顺序是**(X, Y, Z)**(对应二维平面的宽、高,以及切片数量) sitk.GetArrayFromImage()返回的数组形状是**(Z, Y, X)**,和图像尺寸顺序相反,后续处理时需注意对应关系
实现代码
import SimpleITK as sitk # 读取CT图像 filename = "your_ct_file.nii.gz" image = sitk.ReadImage(filename) # 获取原图像的核心参数 original_size = image.GetSize() # 顺序:(X, Y, Z) original_spacing = image.GetSpacing() # 像素间距,顺序:(X, Y, Z) target_size = [64, 64, 16] # 目标尺寸,顺序:(X, Y, Z) # 计算各维度的裁剪/填充参数 crop_lower = [0, 0, 0] # 各维度从起始端裁剪的数量 crop_upper = [0, 0, 0] # 各维度从末端裁剪的数量 pad_lower = [0, 0, 0] # 各维度从起始端填充的数量 pad_upper = [0, 0, 0] # 各维度从末端填充的数量 for dim_idx in range(3): orig_dim = original_size[dim_idx] target_dim = target_size[dim_idx] if orig_dim > target_dim: # 原尺寸大于目标,居中裁剪 diff = orig_dim - target_dim crop_lower[dim_idx] = diff // 2 crop_upper[dim_idx] = diff - crop_lower[dim_idx] elif orig_dim < target_dim: # 原尺寸小于目标,居中填充 diff = target_dim - orig_dim pad_lower[dim_idx] = diff // 2 pad_upper[dim_idx] = diff - pad_lower[dim_idx] # 执行裁剪和填充操作 cropped_image = sitk.Crop(image, crop_lower, crop_upper) # 填充背景值设为CT空气的HU值(-1000),可根据实际情况调整 padded_image = sitk.Pad(cropped_image, pad_lower, pad_upper, constantValue=-1000) # 验证像素间距是否保留 assert padded_image.GetSpacing() == original_spacing, "像素间距被改变" # 转换为数组,调整维度顺序以匹配目标形状[64,64,16](X,Y,Z) resized_array = sitk.GetArrayFromImage(padded_image).transpose(2, 1, 0) print(f"调整后的数组形状:{resized_array.shape}") # 输出:(64, 64, 16)
方案说明
- 裁剪逻辑:当原维度尺寸大于目标时,采用居中裁剪,尽量保留图像的核心区域,避免丢失关键解剖结构信息。
- 填充逻辑:当原维度尺寸小于目标时,在边缘填充CT图像的标准背景值(-1000,对应空气),保证图像的灰度一致性。
- 像素间距保留:
sitk.Crop和sitk.Pad仅调整图像的空间范围(原点和尺寸),不会修改像素间距属性,原有像素的物理间距完全不变。
内容的提问来源于stack exchange,提问作者Sta Hamid
相关产品推荐
相关产品推荐

