开发环境:VS 2022,Windows 10,ITK5.3

使用数据为"D:\Windows\ITK-5.2.1\Examples\Data"下的BrainProtonDensitySliceBorder20.png和BrainProtonDensitySliceR10X13Y17.png

1. 导入所需头文件

#include "itkImageRegistrationMethodv4.h" //包含配准方法
#include "itkTranslationTransform.h" //空间变换
#include "itkMeanSquaresImageToImageMetricv4.h" //损失函数
#include "itkRegularStepGradientDescentOptimizerv4.h"//优化算法
#include "itkImageFileReader.h"//读取图像
#include "itkImageFileWriter.h"//写入结果
#include "itkPNGImageIOFactory.h" //读取PNG图像所需
using namespace std;

2. 实例化所需对象

定义读取图像的维度和像素类型

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>;

3.创建部分对象

通过New()创建,通过itk::SmartPointer赋值

MetricType::Pointer metric = MetricType::New();
OptimizerType::Pointer optimizer = OptimizerType::New();
RegistrationType::Pointer registration = RegistrationType::New();

4. 配置配准方法

将声明的部分对象赋值给配准方法(如优化器,损失函数)

registration->SetMetric(metric);
registration->SetOptimizer(optimizer);

5.配置损失函数

//配置之前需要用到插值方法,因此需要实例化和创建参考和浮动图像的插值对象
using FixedLinearInterpolatorType =itk::LinearInterpolateImageFunction<FixedImageType, double>;
using MovingLinearInterpolatorType =itk::LinearInterpolateImageFunction<MovingImageType, double>;
FixedLinearInterpolatorType::Pointer fixedInterpolator =FixedLinearInterpolatorType::New();
MovingLinearInterpolatorType::Pointer movingInterpolator =MovingLinearInterpolatorType::New();
metric->SetFixedInterpolator(fixedInterpolator);
metric->SetMovingInterpolator(movingInterpolator);

6. 读取图像并放入配准方法中

typedef itk::ImageFileReader< FixedImageType  >   FixedImageReaderType;
typedef itk::ImageFileReader< MovingImageType >   MovingImageReaderType;
FixedImageReaderType::Pointer   fixedImageReader = FixedImageReaderType::New();
MovingImageReaderType::Pointer  movingImageReader = MovingImageReaderType::New();
itk::PNGImageIOFactory::RegisterOneFactory();
fixedImageReader->SetFileName(R"(C:\Users\Richard\Desktop\BrainProtonDensitySliceBorder20.png)");
movingImageReader->SetFileName(R"(C:\Users\Richard\Desktop\BrainProtonDensitySliceR10X13Y17.png)");registration->SetFixedImage(fixedImageReader->GetOutput());
registration->SetMovingImage(movingImageReader->GetOutput());

7.配置空间变换矩阵

TransformType::Pointer 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);
registration->SetMovingInitialTransform(movingInitialTransform);
TransformType::Pointer identityTransform = TransformType::New();
identityTransform->SetIdentity();
registration->SetFixedInitialTransform(identityTransform);

8.配置优化器参数

optimizer->SetLearningRate(4);
optimizer->SetMinimumStepLength(0.001);
optimizer->SetRelaxationFactor(0.5);
optimizer->SetNumberOfIterations(200);
constexpr unsigned int numberOfLevels = 1;
RegistrationType::ShrinkFactorsArrayType shrinkFactorsPerLevel;
shrinkFactorsPerLevel.SetSize(1);
shrinkFactorsPerLevel[0] = 1;
RegistrationType::SmoothingSigmasArrayType smoothingSigmasPerLevel;
smoothingSigmasPerLevel.SetSize(1);
smoothingSigmasPerLevel[0] = 0;
registration->SetNumberOfLevels(numberOfLevels);
registration->SetSmoothingSigmasPerLevel(smoothingSigmasPerLevel);

9. 开始配准并输出最终结果

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();cout << bestValue<<endl;cout << TranslationAlongX << endl;cout << TranslationAlongY << endl;
}

##完整代码


#include "itkImageRegistrationMethodv4.h"
#include "itkTranslationTransform.h"
#include "itkMeanSquaresImageToImageMetricv4.h"
#include "itkRegularStepGradientDescentOptimizerv4.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkPNGImageIOFactory.h"
using namespace std;
int main()
{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>;MetricType::Pointer metric = MetricType::New();OptimizerType::Pointer optimizer = OptimizerType::New();RegistrationType::Pointer registration = RegistrationType::New();registration->SetMetric(metric);registration->SetOptimizer(optimizer);using FixedLinearInterpolatorType =itk::LinearInterpolateImageFunction<FixedImageType, double>;using MovingLinearInterpolatorType =itk::LinearInterpolateImageFunction<MovingImageType, double>;FixedLinearInterpolatorType::Pointer fixedInterpolator =FixedLinearInterpolatorType::New();MovingLinearInterpolatorType::Pointer movingInterpolator =MovingLinearInterpolatorType::New();metric->SetFixedInterpolator(fixedInterpolator);metric->SetMovingInterpolator(movingInterpolator);typedef itk::ImageFileReader< FixedImageType  >   FixedImageReaderType;typedef itk::ImageFileReader< MovingImageType >   MovingImageReaderType;FixedImageReaderType::Pointer   fixedImageReader = FixedImageReaderType::New();MovingImageReaderType::Pointer  movingImageReader = MovingImageReaderType::New();itk::PNGImageIOFactory::RegisterOneFactory();fixedImageReader->SetFileName(R"(C:\Users\Richard\Desktop\BrainProtonDensitySliceBorder20.png)");movingImageReader->SetFileName(R"(C:\Users\Richard\Desktop\BrainProtonDensitySliceR10X13Y17.png)");registration->SetFixedImage(fixedImageReader->GetOutput());registration->SetMovingImage(movingImageReader->GetOutput());TransformType::Pointer movingInitialTransform = TransformType::New();TransformType::ParametersType initialParameters(movingInitialTransform->GetNumberOfParameters());initialParameters[0] = 0.0; // Initial offset in mm along XinitialParameters[1] = 0.0; // Initial offset in mm along YmovingInitialTransform->SetParameters(initialParameters);registration->SetMovingInitialTransform(movingInitialTransform);TransformType::Pointer identityTransform = TransformType::New();identityTransform->SetIdentity();registration->SetFixedInitialTransform(identityTransform);optimizer->SetLearningRate(4);optimizer->SetMinimumStepLength(0.001);optimizer->SetRelaxationFactor(0.5);optimizer->SetNumberOfIterations(200);constexpr unsigned int numberOfLevels = 1;RegistrationType::ShrinkFactorsArrayType shrinkFactorsPerLevel;shrinkFactorsPerLevel.SetSize(1);shrinkFactorsPerLevel[0] = 1;RegistrationType::SmoothingSigmasArrayType smoothingSigmasPerLevel;smoothingSigmasPerLevel.SetSize(1);smoothingSigmasPerLevel[0] = 0;registration->SetNumberOfLevels(numberOfLevels);registration->SetSmoothingSigmasPerLevel(smoothingSigmasPerLevel);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();cout << bestValue<<endl;cout << TranslationAlongX << endl;cout << TranslationAlongY << endl;
}

ITK 2D图像刚性配准相关推荐

  1. ITK:将2D图像堆叠为3D图像

    ITK:将2D图像堆叠为3D图像 内容提要 C++实现代码 内容提要 TileImageFilter C++实现代码 #include "itkTileImageFilter.h" ...

  2. 图像平移配准matlab,(MATLAB应用图像处理)第6章MATLAB图像配准.ppt

    第6章 MATLAB图像配准 6.1 图像配准概述 6.1.1 图像配准定义 图像配准是对从不同传感器.不同时间.不同视点所获得的两幅或多幅图像进行最佳匹配,以达到空间匹配和叠加目的的处理过程.本质上 ...

  3. [骨科手术导航]2D/3D医学图像配准研究_罗博博_南方科技大学

    1.绪论 1.1 手术导航 #手术导航是以CT/MRI等医学影像数据为基础,通过虚拟现实技术,定位追踪后显示出手术器械相对病变组织的位置关系,从而实现对手术过程的实时引导. #在外科手术中,临床医生能 ...

  4. 用单张2D图像重构3D场景

    用单张2D图像重构3D场景 zouxy09@qq.com http://blog.csdn.net/zouxy09 之前看到Stanford大学的机器学习公开课程的lecture01中,Andrew ...

  5. 2D图像转3D仅需5秒,特斯拉的自动驾驶技术有救了?

    来源:科技智谷 编译:徐浩 75年前,宝丽来相机拍摄出第一张即时照片,是人类第一次以逼真的二维图像快速捕捉三维世界,具有划时代的意义.今天,人工智能的研究人员正在进行相反的工作,力求在几秒钟的时间内将 ...

  6. 通过.obj生成2d图像_自动生成 凹凸法线灯贴图 插件

    CrazyBump疯狂凹凸自动生成凹凸法线灯贴图 CrazyBump是一款专业的法线贴图制作软件,人们一般称之为超级法线凹凸生成软件,用来做材质中贴图中的凹凸和法线贴图是非常不错的,CrazyBump ...

  7. 腾讯优图13篇论文入选ICCV2019,涉及2D图像多视图生成等研究

    允中 发自 凹非寺  量子位 报道 | 公众号 QbitAI 两年一度AI顶会ICCV已经召开,今年在韩国首尔举办. 随着论文收录名单揭晓,大会也进入放榜收获时刻. 腾讯旗下顶级视觉研发平台腾讯优图, ...

  8. unity怎么实现人脸追踪_Unity 2019.2 beta为AR增加面部追踪、2D图像追踪、3D对象追踪等功能...

    Unity今天正式放出了Unity 2019.2 beta.对于这个版本,Unity集成了热门的Polybrush工具,添加了Unity Distribution Platform,同时扩展了用于XR ...

  9. 将隐式神经表示(INR)用于2D图像

    ©PaperWeekly 原创 · 作者 | 张一帆 学校 | 中科院自动化所博士生 研究方向 | 计算机视觉 以图像为例,其最常见的表示方式为二维空间上的离散像素点.但是,在真实世界中,我们看到的世 ...

最新文章

  1. Android Material各种颜色设置
  2. 浓缩精华的架构演进过程,我连看了六遍!
  3. stutBar的使用
  4. Jquery的分页插件
  5. 现在电脑的主流配置_玩手游是因为电脑配置差?现在来告诉你这些网游需要啥配置...
  6. 除了清空购物车,阿里年会的技术也够霸气!
  7. JSTL(JSP Standard Tag Library)读书笔记
  8. mammary cancer关联规则挖掘详解
  9. Linux head命令:显示文件开头的内容
  10. c语言由n个斐波纳函数,6、C语言 —— 字符串
  11. 软件外包项目实施过程中的关键因素(摘自IT168技术频道)
  12. Flutter拓展 一步一步教你安装Flutter(最火的移动框架)
  13. LSD_SLAM编译之一气呵成法
  14. MySQL事件(定时任务)
  15. 斗地主洗牌+发牌+排序
  16. 微信小程序picker多列选择器:mode = multiSelector
  17. pip版本更新的问题
  18. PTA:宿舍谁最高?
  19. Ubuntu 安装sogou拼音
  20. Shell脚本案例:实现局域网扫描功能

热门文章

  1. 每日营养摄入计算与主要的食物成分表(健身必备)
  2. BHM-AN10 OTG 刷机 记录 2021-10-18
  3. android 读取manifestPlaceholders配置的值
  4. 查看 NLS_LANG 的方法
  5. 华为,一口气签约3所大学!
  6. 柯美c7000服务器显示00,柯尼卡美能达bizhub PRESS C7000 故障排除.pdf
  7. DDNS远程连接 群辉DS218+
  8. 今天适合的样式 黑白色 网站黑白色
  9. 打开oracle dmp,dmp文件怎么打开,教你win7系统打开dmp文件的方法
  10. Super-FAN论文阅读