SimpleElastix 安装及常见问题解决

78 篇文章 ¥59.90 ¥99.00
本文提供了SimpleElastix的安装教程,包括Windows、Linux和macOS的步骤,以及解决安装过程中遇到的问题,如环境配置、编译错误和运行时异常的处理方法。

SimpleElastix 是一个用于图像配准的强大工具,它结合了 SimpleITK 和 Elastix 库的功能。在本文中,我将详细介绍如何安装 SimpleElastix,并提供一些常见问题的解决方法。

安装 SimpleElastix

首先,我们需要安装 SimpleElastix。以下是在 Windows、Linux 和 macOS 上安装 SimpleElastix 的步骤:

Windows

  1. 下载 SimpleElastix 的二进制文件(.zip 格式)。
  2. 解压缩下载的文件到一个合适的目录。
  3. 配置环境变量 SIMPLEITK_HOME,指向 SimpleITK 的安装路径。
  4. 将 SimpleElastix 的目录添加到环境变量 PATH 中。

Linux

  1. 打开终端,并执行以下命令安装依赖项:

    sudo apt-get update
    sudo apt-get 
import os import numpy as np import SimpleITK as sitk import tkinter as tk from tkinter import filedialog root = tk.Tk() root.withdraw() fixed_path = filedialog.askdirectory(title="选择固定DICOM序列文件夹") moving_path = filedialog.askdirectory(title="选择移动DICOM序列文件夹") def read_dicom_series(path): reader = sitk.ImageSeriesReader() series_ids = reader.GetGDCMSeriesIDs(path) if not series_ids: raise ValueError(f"在路径 {path} 中未找到DICOM序列") dicom_names = reader.GetGDCMSeriesFileNames(path, series_ids[0]) reader.SetFileNames(dicom_names) return reader.Execute() fixed_image = read_dicom_series(fixed_path) moving_image = read_dicom_series(moving_path) moving_image.SetDirection(fixed_image.GetDirection()) if moving_image.GetPixelID() != fixed_image.GetPixelID(): moving_image = sitk.Cast(moving_image, fixed_image.GetPixelID()) initial_transform = sitk.CenteredTransformInitializer( fixed_image, moving_image, sitk.Euler3DTransform(), sitk.CenteredTransformInitializerFilter.MOMENTS ) resampled_moving = sitk.Resample( moving_image, fixed_image, initial_transform, sitk.sitkLinear, 0.0 ) elastixImageFilter = sitk.ElastixImageFilter() elastixImageFilter.SetFixedImage(fixed_image) elastixImageFilter.SetMovingImage(resampled_moving) def set_common_parameters(param_map): # 图像金字塔:逐层降分辨率处理 param_map["FixedImagePyramid"] = ["FixedShrinkingImagePyramid"] param_map["MovingImagePyramid"] = ["MovingShrinkingImagePyramid"] param_map["ShrinkFactors"] = ["4", "2", "1"] # 每一层下采样倍数 param_map["SmoothingSigmas"] = ["2", "1", "0"] # 高斯平滑标准差(单位:mm) param_map["UseDirectionCosines"] = ["true"] # 保持方向一致性(重要!) # 相似性度量:高级互信息(推荐用于多模态) param_map["Metric"] = ["AdvancedMattesMutualInformation"] param_map["NumberOfHistogramBins"] = ["50"] # 灰度级分桶数,32~64 合理 # 采样设置:三选一 —— Random / Regular / Full param_map["ImageSampler"] = ["Random"] param_map["NumberOfSpatialSamples"] = ["2000"] # 减少以提升稳定性(原5000太大) # param_map["SamplingPercentage"] = ["0.05"] # ❌ 不要和 NumberOfSpatialSamples 同时设! # 优化器:推荐使用自适应随机梯度下降(适合随机采样) param_map["Optimizer"] = ["AdaptiveStochasticGradientDescent"] param_map["MaximumNumberOfIterations"] = ["500"] # 每层最多迭代次数 param_map["SP_alpha"] = ["50"] # 步长衰减因子 param_map["SP_A"] = ["50"] # 增益调节参数 param_map["SP_a"] = ["0.1"] # 初始步长比例 # 变换模型(根据需求选择) param_map["Transform"] = ["AffineTransform"] # 或 "EulerTransform" 做刚性/仿射 return param_map rigid_param=sitk.GetDefaultParameterMap("rigid") affine_param = sitk.GetDefaultParameterMap("affine") elastixImageFilter.SetParameterMap(rigid_param) elastixImageFilter.AddParameterMap(affine_param) elastixImageFilter.Execute() registered_img = elastixImageFilter.GetResultImage() print("开始计算最优 Dice 系数...") def calculate_optimal_dice(fixed_img, registered_img, threshold_range=None): """ 自动寻找使 Dice 系数最大的阈值,并返回最大 Dice 和对应阈值。 参数: fixed_img: 固定图像 (SimpleITK Image) registered_img: 配准后的移动图像 (SimpleITK Image) threshold_range: 遍历的阈值范围,例如 range(10, 200, 5) 如果为 None,则自动基于图像强度设定 返回: best_dice: 最大 Dice 系数 best_threshold: 对应的最佳阈值 all_results: 所有测试阈值和对应的 Dice 值列表 [(th, dice), ...] """ # 转换为 NumPy 数组 fixed_arr = sitk.GetArrayFromImage(fixed_img) reg_arr = sitk.GetArrayFromImage(registered_img) # 自动设定阈值范围(若未提供) if threshold_range is None: min_val = max(np.min(fixed_arr), np.min(reg_arr)) max_val = min(np.max(fixed_arr), np.max(reg_arr)) # 只考虑非背景区域(排除零或极低值) threshold_range = range(int(min_val + 5), int(max_val), 5) all_results = [] best_dice = 0.0 best_threshold = None for th in threshold_range: # 构建二值化 ROI fixed_roi = (fixed_arr > th).astype(np.uint8) reg_roi = (reg_arr > th).astype(np.uint8) intersection = np.sum(fixed_roi & reg_roi) sum_roi = np.sum(fixed_roi) + np.sum(reg_roi) dice = (2.0 * intersection) / sum_roi if sum_roi != 0 else 0.0 all_results.append((th, dice)) if dice > best_dice: best_dice = dice best_threshold = th return best_dice, best_threshold, all_results best_dice, best_threshold, all_results = calculate_optimal_dice(fixed_image, registered_img) print(f"\n✅ 配准精度评估完成:") print(f"最大 Dice 系数: {best_dice:.4f}") print(f"对应最佳阈值: {best_threshold}") sitk.WriteImage(registered_img, r"D:\Desktop\sitk\Hospital\2120928\test4-1013.nii") root.destroy() print( "Fixed Image Spacing:", fixed_image.GetSpacing(), "Fixed Image Size:",fixed_image.GetSize(), "Fixed Image Origin:",fixed_image.GetOrigin() ) print( "Moving Image Spacing:", moving_image.GetSpacing(), "Moving Image Size:",moving_image.GetSize(), "Moving Image Origin:", moving_image.GetOrigin() ) print( "Registered Image Spacing:", registered_img.GetSpacing(), "Registered Image Size:",registered_img.GetSize(), "Registered Image Origin:", registered_img.GetOrigin() )和Simpleitk-simpleelastix的特征检测结合进行有效配准,语句简洁,不要修改我的输入输出路径,不用可视化
最新发布
10-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值