2.基于ITK库的3D医学图像配准-1

1.基于ITK库的3D医学图像配准: 

配准的过程主要包括四个模块,即:变换,插值,准则,优化。配准过程实际上可以认为是一个优化过程。

  • 待配准图像变换到参考图像的坐标系。
  • 插值:解决变换引起的位置、亮度值等的差异,如线性插值,邻域插值等等。
  • metric(准则),如均方差,互信息准则等等。用于将变化后图像的差异数学化,它的输入包括:参考图像和待配准图像,变换函数和interpolator(插值器)。用准则对数据进行计算后的值将用优化器进行优化,优化后的参数将返回迭代再进行配准,一直到达到要求。
  • 优化器有两种类型:1.singalvalue,即优化器返回单值的cost function,2.返回多值的,即muti-value。
    • 配准是基于上述四个部分,针对不同的图形情况,如单模,多模,去用不同的准则,变换,优化器和插值方法。
    • 不同部分的参数设置是难点。
    • 不同的优化器,往往参数设置不同,这个就需要了解优化器和配准方法的算法。

 2.配准步骤:

  • 设置待配准图像和参考图像的像素类型,维数。
  • 实例化上述四个部分,并将其组合到registration中,设置各部分的参数,并触发配准开始。(实例化往往先定义——tyoedef,再指向智能指针,然后通过指针调用set*()函数设置参数。)
  • 通过最终得到的参数重采样带配准图像,得到配准结果。
  • 比较配准前后和配准过程后的差异。
  • 配准过程中,有时会根据具体情况先用*filter对图像进行处理。如在配准中对精度要求高的话,先用cast*filter将图像转化为float型,配准后再转化为char,或int型存储。如果图像噪声比较明显,也可以先用*filter除噪在配准。有的也用filter保留边缘,在配准。
  • ITK的参数输入是在工程的属性dubug中输入,如:配准图像的文件名称,优化器的某些参数,变化后图像配准区域外的亮度,输出图像的名字等等。具体代码较多这里不附上,只要理解上述过程,代码是比较好看的。

3.配准框架:

       配准框架的基本成员:两个输入图像、一个变换、一个路径选择、一个校对机和一个优化器。

过程:

  • 待配准图像通过 变换函数(T(x)) 到参考图像的映射过程。
  • 传递函数 T(X)表示从参考图像上的点到待配准图像上的点的空间映射关系。
  • 校对机被用来评估待配准图像在非网格位置的程度。
  • 成员路径选择 S(f, m×T)提供了一种参考图像被待配准图像配准的程度。

4.配准方法:两个输入的图像、转换函数、度量、校对机和优化器(配准方法中的成分的每种类型都应该首先被实例化)。

  • 1.两个输入的图像
    • const unsigned int Dimension = 2;//图像数据类型参数,维度
    • typedef float PixelType;//图像数据类型参数,像素类型
    • 输入数据的类型通过下面几行表达:
    • typedef itk::Image< PixelType, Dimension > FixedImageType;
    • typedef itk::Image< PixelType, Dimension > MovingImageType;
  • 2.图像转换
    • 把参考图像空间映射到待配准图像空间的转换如下:
    • typedef itk::TranslationTransform< double, Dimension > TransformType;//转换类型
  • 3.度量
    • 衡量标准为比较两幅图像的搭配质量。衡量标准通常已经参数化,例如说下面对图像类型的声明:
    • typedef itk::MeanSquaresImageToImageMetric<FixedImageType,MovingImageType > MetricType;
  • 4.选择校对机的类型
    • typedef itk:: LinearInterpolateImageFunction<MovingImageType,double > InterpolatorType;//选择插值类型
  • 5.配准方法
    • 配准方法的类型是通过参考和待配准图像的类型来表示的。
      • typedef itk::ImageRegistrationMethod<FixedImageType,MovingImageType > RegistrationType;
    • 配准的要素:转换,度量,校对机,优化方法。
    • 以下为要素:
    • 每一个配准要素都是通过它的New( )创建的,并且通过各自的itk::SmartPointer赋值。
      • MetricType::Pointer metric = MetricType::New( );
      • TransformType::Pointer transform = TransformType::New( );
      • 优化器Type::Pointer 优化器 = 优化器Type::New( );
      • InterpolatorType::Pointer interpolator = InterpolatorType::New( );
      • RegistrationType::Pointer registration = RegistrationType::New( );
    • 每一个要素被连接到配准方法的程序中:
      • registration->SetMetric( metric );
      • registration->SetOptimitor( optimitor);
      • registration->SetTransform( transform );
      • registration->SetInterpolator( interpolator );
    • 配准需要的输入图像读取示例:
      • 参考和待配准图像从文件里读取。 这就需要itk::ImageRegistrationMethod从readers的输出中获得它的输入数据。
      • registration->SetFixedImage( fixedImageReader->GetOutput( ) );
      • registration->SetMovingImage( movingImageReader->GetOutput( ) );
    • 需要配准的图像可能只是图像中的部分区域,以下为设置指定区域操作:
      • 这样的区域通过参考图像的BufferedRegion定义。注意,在这个区域首先要调用它的Update( )方法:
      • fixedImageReader->Update( );
      • registration->SetFixedImageRegion(fixedImageReader->GetOutput( )->GetBufferedRegion( ) );
    • 变换参数设置示例(平移):用于变换的参数队列由沿着每一维的方向的平移值构成。设置参数值到零以便将变换初始成恒等变换。
      • typedef RegistrationType::ParametersType//变换类型
      • ParametersType;ParametersTypeinitialParameters(transform->GetNumberOfParameters( ) );
      • initialParameters[0] = 0.0; // Initial offset in mm along X
      • initialParameters[1] = 0.0; // Initial offset in mm along Y
      • registration->SetInitialTransformParameters( initialParameters );//变换参数设置
    • 准备执行配准方法。优化器用来驱动配准的执行。然而, ImageRegistrationMethod类协调整体以确保在传递给优化器之前一切都到位了。优化器用于收敛得到配准的参数,需要设置。

 

转自:http://blog.sina.com.cn/s/blog_62ccbb810100hven.htmlhttps://blog.csdn.net/zhimingf/article/details/70142427