ITK – 学习指南

ITK – 学习指南官方文档永远是学习的第一手资料 它介绍全面且详实 可以让我们对学习对象有更深刻的认识

大家好,欢迎来到IT知识分享网。

一、ITK 学习资料

        官方文档永远是学习的第一手资料,它介绍全面且详实,可以让我们对学习对象有更深刻的认识。ITK 是一个被广泛认可且被大量引用的用于图像处理、分割和配准的工具库。它的官方学习资料有软件指南(Insight Software Guide)、演示示例和接口详述(the Doxygen documentation)。

  •         软件指南概述了ITK的一些关键概念,并提供了如何构建和安装软件的指导。可以首先通过阅读该文档对ITK有个总体的认识。
  •         演示示例可以使我们对ITK的使用建立信心并进一步提升了解。这里有两个示例来源:(1)源码库里的示例目录(可从官方发布版本获取);(2)官方参考示例
  •         最后在学习和应用过程中我们需要参阅接口详述资料,事实上这是大部分人参考最多的资料。不同版本的接口文档都可以通过在线获得。如5.3的文档可通过访问ITK: Insight Toolkit

二、ITK – 配准(“hello world”)

2.1 基本配准流程

#include "itkImageRegistrationMethodv4.h" #include "itkTranslationTransform.h" #include "itkMeanSquaresImageToImageMetricv4.h" #include "itkRegularStepGradientDescentOptimizerv4.h" #include "itkImage.h" #include "itkImageFileReader.h" #include "itkImageFileWriter.h" #include <itkMetaImageIO.h> #include "itkResampleImageFilter.h" #include "itkCastImageFilter.h" #include "itkRescaleIntensityImageFilter.h" #include "itkSubtractImageFilter.h" //定义输入输出数据路径 std::string FixedImgFile = "C:/temp/BrainProtonDensitySliceBorder20.mhd"; std::string MovImgFile = "C:/temp/BrainProtonDensitySliceShifted13x17y.mhd"; std::string RegMovFile = "C:/temp/Reg.raw"; std::string RegDif = "C:/temp/RegDif.raw"; std::string RawDif = "C:/temp/RawDif.raw"; //定义基本组件类型(包括TrainsformType,OptinizerType,MetricType,RegistrationType) constexpr unsigned int Dimension = 2; using PixelType = float; using FixedImageType = itk::Image<PixelType, Dimension>; using MovingImageType = itk::Image<PixelType, Dimension>; using TransformType = itk::TranslationTransform<double, Dimension>; using OptimizerType = itk::RegularStepGradientDescentOptimizerv4<double>; using MetricType = itk::MeanSquaresImageToImageMetricv4<FixedImageType, MovingImageType>; using RegistrationType = itk:: ImageRegistrationMethodv4<FixedImageType, MovingImageType, TransformType>; //实例化配准基本组件 auto metric = MetricType::New(); auto optimizer = OptimizerType::New(); auto registration = RegistrationType::New(); //设置图像空间转换到虚拟空间的插值方式(默认线性插值) using FixedLinearInterpolatorType = itk::LinearInterpolateImageFunction<FixedImageType, double>; using MovingLinearInterpolatorType = itk::LinearInterpolateImageFunction<MovingImageType, double>; auto fixedInterpolator = FixedLinearInterpolatorType::New(); auto movingInterpolator = MovingLinearInterpolatorType::New(); metric->SetFixedInterpolator(fixedInterpolator); metric->SetMovingInterpolator(movingInterpolator); //利用ImageFileReader读取参考图和浮动图 using FixedImageReaderType = itk::ImageFileReader<FixedImageType>; using MovingImageReaderType = itk::ImageFileReader<MovingImageType>; auto fixedImageReader = FixedImageReaderType::New(); auto movingImageReader = MovingImageReaderType::New(); itk::MetaImageIO::Pointer metaIO = itk::MetaImageIO::New(); fixedImageReader->SetImageIO(metaIO); //显式的指定特定格式读取方式 movingImageReader->SetImageIO(metaIO); fixedImageReader->SetFileName(FixedImgFile); movingImageReader->SetFileName(MovImgFile); //设置图像空间到虚拟空间的初始位移 auto movingInitialTransform = TransformType::New(); TransformType::ParametersType initialParameters( movingInitialTransform->GetNumberOfParameters()); initialParameters[0] = 0.0; // Initial offset in mm along X initialParameters[1] = 0.0; // Initial offset in mm along Y movingInitialTransform->SetParameters(initialParameters); auto identityTransform = TransformType::New(); identityTransform->SetIdentity(); registration->SetFixedInitialTransform(identityTransform); //设定优化器优化参数 optimizer->SetLearningRate(4); //初始学习率,默认为1 optimizer->SetRelaxationFactor(0.5); //学习率衰减因子(0-1),默认0.5 optimizer->SetNumberOfIterations(200); optimizer->SetMinimumStepLength(0.001); auto observer = CommandIterationUpdate::New(); optimizer->AddObserver(itk::IterationEvent(), observer); //输出迭代过程 //设定配准寻优过程的优化层级 constexpr unsigned int numberOfLevels = 1; RegistrationType::ShrinkFactorsArrayType shrinkFactorsPerLevel; shrinkFactorsPerLevel.SetSize(1); shrinkFactorsPerLevel[0] = 1; RegistrationType::SmoothingSigmasArrayType smoothingSigmasPerLevel; smoothingSigmasPerLevel.SetSize(1); smoothingSigmasPerLevel[0] = 0; //将定义的配准参数塞进配准类 registration->SetMetric(metric); registration->SetOptimizer(optimizer); registration->SetFixedImage(fixedImageReader->GetOutput()); registration->SetMovingImage(movingImageReader->GetOutput()); registration->SetMovingInitialTransform(movingInitialTransform); registration->SetNumberOfLevels(numberOfLevels); registration->SetSmoothingSigmasPerLevel(smoothingSigmasPerLevel); registration->SetShrinkFactorsPerLevel(shrinkFactorsPerLevel); //通过Updata()方法执行配准过程 try { registration->Update(); std::cout << "Optimizer stop condition: " << registration->GetOptimizer()->GetStopConditionDescription() << std::endl; } catch (const itk::ExceptionObject& err) { std::cerr << "ExceptionObject caught !" << std::endl; std::cerr << err << std::endl; return EXIT_FAILURE; } //获取配准的结果(计算的位移量,迭代参数等) TransformType::ConstPointer transform = registration->GetTransform(); TransformType::ParametersType finalParameters = transform->GetParameters(); const double TranslationAlongX = finalParameters[0]; const double TranslationAlongY = finalParameters[1]; const unsigned int numberOfIterations = optimizer->GetCurrentIteration(); const double bestValue = optimizer->GetValue(); std::cout << "Result = " << std::endl; std::cout << " Translation X = " << TranslationAlongX << std::endl; std::cout << " Translation Y = " << TranslationAlongY << std::endl; std::cout << " Iterations = " << numberOfIterations << std::endl; std::cout << " Metric value = " << bestValue << std::endl; //组合优化位移和初始位移作为最终的位移 using CompositeTransformType = itk::CompositeTransform<double, Dimension>; auto outputCompositeTransform = CompositeTransformType::New(); outputCompositeTransform->AddTransform(movingInitialTransform); outputCompositeTransform->AddTransform( registration->GetModifiableTransform()); //根据最终的位移量对movingImage进行重采样得到配准后的movingImage using ResampleFilterType = itk::ResampleImageFilter<MovingImageType, FixedImageType>; auto resampler = ResampleFilterType::New(); resampler->SetInput(movingImageReader->GetOutput()); resampler->SetTransform(outputCompositeTransform); FixedImageType::Pointer fixedImage = fixedImageReader->GetOutput(); resampler->SetSize(fixedImage->GetLargestPossibleRegion().GetSize()); resampler->SetOutputOrigin(fixedImage->GetOrigin()); resampler->SetOutputSpacing(fixedImage->GetSpacing()); resampler->SetOutputDirection(fixedImage->GetDirection()); resampler->SetDefaultPixelValue(100); //区分背景值为了展示图像的位移量 //转换图像类型并将其写出 using OutputPixelType = unsigned char; using OutputImageType = itk::Image<OutputPixelType, Dimension>; using CastFilterType = itk::CastImageFilter<FixedImageType, OutputImageType>; auto caster = CastFilterType::New(); caster->SetInput(resampler->GetOutput()); caster->Update(); unsigned int length = 221 * 257; OutputImageType::Pointer image = caster->GetOutput(); OutputPixelType* buffer = image->GetBufferPointer(); WriteRawData(RegMovFile, (unsigned char*)buffer, length); //计算配准后movingImage和fixedImage的差值 using DifferenceFilterType = itk::SubtractImageFilter<FixedImageType, FixedImageType, FixedImageType>; auto difference = DifferenceFilterType::New(); difference->SetInput1(fixedImageReader->GetOutput()); difference->SetInput2(resampler->GetOutput()); using RescalerType = itk::RescaleIntensityImageFilter<FixedImageType, OutputImageType>; auto intensityRescaler = RescalerType::New(); //Rescaler的目的是为了更清楚的显示差异 intensityRescaler->SetInput(difference->GetOutput()); intensityRescaler->SetOutputMinimum(0); intensityRescaler->SetOutputMaximum(255); resampler->SetDefaultPixelValue(1); intensityRescaler->Update(); OutputImageType::Pointer difImage = intensityRescaler->GetOutput(); OutputPixelType* difbuffer = difImage->GetBufferPointer(); WriteRawData(RegDif, difbuffer, length); //计算配准前movingImage和fixedImage的差值 resampler->SetTransform(identityTransform); intensityRescaler->Update(); image = intensityRescaler->GetOutput(); buffer = image->GetBufferPointer(); WriteRawData(RawDif, (unsigned char*)buffer, length);

2.2 配准方式的不同选择

2.2.1 相似性度量的选择

        常见的配准度量有用于同模态的均方差(MSE)、归一化互相关性(NCC)、用于跨模态的互信息(MI)等。

        当使用互信息时作为相似性度量时,我们需要设定一些特别的参数用于计算。

#include "itkImageRegistrationMethodv4.h" #include "itkTranslationTransform.h" #include "itkMattesMutualInformationImageToImageMetricv4.h" #include "itkRegularStepGradientDescentOptimizerv4.h" //指定相似性度量 using MetricType = itk::MattesMutualInformationImageToImageMetricv4<FixedImageType, MovingImageType>; auto metric = MetricType::New(); registration->SetMetric(metric); //指定bin数量,这个参数比较重要 metric->SetNumberOfHistogramBins(24); //一般情况下50个是足够的。 metric->SetUseMovingImageGradientFilter(false); //这里不清楚为啥会用到图像梯度 metric->SetUseFixedImageGradientFilter(false); //设定其他优化器参数 optimizer->SetLearningRate(8.00); optimizer->SetMinimumStepLength(0.001); optimizer->SetNumberOfIterations(200); optimizer->ReturnBestParametersAndValueOn(); optimizer->SetRelaxationFactor(0.8); RegistrationType::MetricSamplingStrategyEnum samplingStrategy = RegistrationType::MetricSamplingStrategyEnum::RANDOM; registration->SetMetricSamplingStrategy(samplingStrategy); registration->SetMetricSamplingPercentage(0.2); registration->MetricSamplingReinitializeSeed(); 
2.2.2 优化器的选择

2.2.3 配准方式的选择

2.2.4 初始化方式的选择

2.2.5 配准层级的选择

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/138429.html

(0)
上一篇 2025-06-12 21:20
下一篇 2025-06-12 21:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信