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.html,https://blog.csdn.net/zhimingf/article/details/70142427