import SimpleITK as sitk
import os
def normalize_image(image_path, output_path):
"""对单张MRI图像进行强度归一化到[0, 255],并转换为uint8"""
try:
# 读取图像
image = sitk.ReadImage(image_path)
# 设置强度归一化的过滤器
rescale_filter = sitk.RescaleIntensityImageFilter()
rescale_filter.SetOutputMaximum(1)
rescale_filter.SetOutputMinimum(0)
# 执行强度规范化
normalized_image = rescale_filter.Execute(image)
# 将图像转换为uint8类型
normalized_image_uint8 = sitk.Cast(normalized_image, sitk.sitkUInt8)
# 保存强度规范化后的图像
sitk.WriteImage(normalized_image_uint8, output_path)
print(f"图像已保存到:{output_path}")
except Exception as e:
print(f"处理图像 {image_path} 时出错: {e}")
def process_directory(file_dir):
"""循环目录,将MR的灰度值归一化到[0,255]"""
N = 0
for root, dirs, files in os.walk(file_dir):
for path in dirs:
end_dirs = os.path.join(root, path) # 使用os.path.join避免拼接错误
# 只处理包含'T'的目录
if 'T' in end_dirs:
for img_name in os.listdir(end_dirs):
# 只处理文件名中包含"IMG_Resample"的图像
if "IMG_Resample" in img_name:
image_path = os.path.join(end_dirs, img_name)
output_path = os.path.join(end_dirs, img_name.replace('IMG_Resample', 'IMG_Resample_Norm'))
# 进行图像归一化
normalize_image(image_path, output_path)
# 删除原始图像文件
os.remove(image_path)
N += 1
print(f'已完成个数:{N}')
# 调用函数
process_directory( '../xx/D_multicenter_Dicom')
上述代码,文件查询的过程大家需要做适应性修改以适应自己的文件夹。此外,关于MRI文件强度规范化的范围值,可以参考以下:
- [0, 1]:最常见,适合一般的处理和机器学习任务。
- [-1, 1]:适合神经网络和深度学习任务,有助于加速训练过程。
- Z-score标准化:适合需要去除强度偏差或均衡强度分布的情况。
- [0, 255]:用于图像显示或与其他图像格式兼容的情况。
- 分区规范化:适用于多样本间的强度标准化,尤其用于跨设备或跨患者的数据集成。
选择哪种规范化方法取决于具体的应用场景,特别是在处理多种不同扫描参数、设备或患者数据时,可能需要根据需求选择合适的规范化方法。
一般设置【0,1】规范化区间最为常见。