医学开源配准软件Elastix手册(中文翻译)——第七章 开发向导

第七章  开发向导

7.1 和ITK 的关系

大部分的elastix代码是基于ITK的。使用ITK意味着可以测试基类(图片类,存储分配)。自然ITK支持的图片格式elastix也支持。C++源码可以在多种操作系统上使用多种编译器(最新版本VS2010,GCC最新版本4.4.3)编译(windows xplinux mac os x),且兼容32位64位。

除了已有的ITK图像配准类,elastix增加了新的功能,最重要的更新如下面的表格:

1、采样策略的模块化,详见Staring andKlein [2010b].

2、新的优化器:Kiefer-Wolfowitz, Robbins-Monro, adaptive stochastic gradient descent, evolutionary strategy,完善了现有ITK的优化器,增加用户控制能很好的处理问题:拟牛顿,非线性共轭梯度。

3、一些新的更灵活的成本函数:归一化互信息,完成Parzen窗,多特征的共同a信息,弹性能力惩罚项和刚性惩罚项。

4、能连用多个变量的几何变换

5、支持很多变微分的计算

6、成本函数的线性结合而不是单一成本函数

7.2 概述elastix代码

Elastix的源代码包含两部分(都用C++写):A)ITK形式的类实现图像的配准功能

B)elastix包包括读取个设置参数,实例化和连接组件,保存中间结果,以及类似管理任务。模块化设计允许在不改变elastix的核心的同时添加新的组件。通过创建一个类的图层来添加新的组件,它可以独立于B进行编译和测试。然后,需要写一个很小的B类包,用来连接A部分到elastix的其他部分。

例如,图像采样是利用继承基类itk::ImageSamplerBase的ITK类实现的,这在src/Common/ImageSamplers中可以看到。这就是上面所述的A部分。每次采样(random, grid, full...)都需要写一个包,在src/Components/ImageSamplers中,负责在配准过程中每次新的分辨率之前配置采样器。这就是B类的部分。

7.2.1  目录结构

基本的目录结构是:

1、Dox

2、Src/Common:ITK类,A部分层,这里也包括一些外部库,和ITK无关,像xout(我们自己写的)还有ANNlib

3、Src/Core:这是主要的elastix核,负责执行流,连接类,读参数等。

4、Src/Compounts:这个目录包括组件和elastix包(B部分)也可以看到一些特定的A部分代码。

Elastix4.4以及以后的版本,你可以增加自己的组件目录。可以位于elastix资源目录以外的地方。详见7.4节

7.3  在你自己的代码中包含elastix代码

你可能会发现在你自己的工程中需要用一些elastix类。例如,你在研发一个新的elastix组件,需要在elastix外部测试它(见7.4节,这样,你需要把需要的文件拷到你的工程中去,或者手动设置路径,但这会不方便)

简化之,在elastix的二进制目录中生成UseElastix.cmake文件。你可以将其CMakeLists.txt包括在你的工程中,CMake将会设置所有必要的包含目录。你还可以连接到elastix库,如elxCommon,来避免重新编译代码。

在elastix的资源分布目录dox/externalproject可以看到这样一个例子。

7.4 创建新的组件

如果你想要创建自己的组件,需要先写A部分类,不考虑elastix。A图层过滤器应该实现所有基本功能,如果能达到预期效果你可以单独使用ITK进行测试。

一旦你的ITK类可以使用,写B包是很容易的事情(一开始先把现有组件的包拷过来)。

利用CMake,告诉elastix你的新组件的源代码目录,使用ELASTIX_USER_COMPONENT_DIRS选项。Cmake将会在其子目录下搜索包含ADDELXCOMPONENT( <name> ... ).的CMakeLists.txt文件。CMakeLists.txt文件中将会包含一个和下面的例子很像的elastix组件:

ADD_ELXCOMPONENT(AdvancedMeanSquaresMetric

elxAdvancedMeanSquaresMetric.h

elxAdvancedMeanSquaresMetric.hxx

elxAdvancedMeanSquaresMetric.cxx

itkAdvancedMeanSquaresImageToImageMetric.h

itkAdvancedMeanSquaresImageToImageMetric.hxx )

ADD_ELXCOMPONENT是一个宏定义,定义在src/Components/CMakeLists.txt中。第一个参数是B部分包类的名字,在头文件“elxAdvancedMeanSquaresMetric.h”中已经声明。然后你可以指定源文件依赖的组件。例子中,文件一开始是ITK形式的A部分代码。文件以elx开头的是B部分代码。文件“elxAdvancedMeanSquaresMetric.cxx”特别简单,只有两行:

#include"elxAdvancedMeanSquaresMetric.h"

elxInstallMacro( AdvancedMeanSquaresMetric );

elxInstallMacro定义在src/Core/Install/elxMacro.h

文件elxAdvancedMeanSquaresMetric.h/hxx一起定义B包类。这个类是继承相应A类和elx::BaseComponent。这允许我们给所有的elastix组件添加通用接口,无论是从哪个ITK类继承过来的。下面是接口的方法:

voidBeforeAll(void)

voidBeforeRegistration(void)

voidBeforeEachResolution(void)

voidAfterEachResolution(void)

void AfterEachIteration(void)

void AfterRegistration(void)

这种方法将自动调用该名称的函数。这将允许你读取或者设置一些参数,打印输出,保存结果。

7.5 代码格式

为了提高代码的可读性和连贯性,采用一种编码格式对于日后维护有很大作用。

1.不使用tabs。

2.末行不留空格。

3.直观化的函数名

4.规范的代码格式

5.好的注释

你可能感兴趣的:(开源,软件,中文手册,elastix)