参考:https://itk.org/ITKSoftwareGuide/html/Book2/ITKSoftwareGuide-Book2ch3.html#x26-1740003.18
3.11 Metrics
在ITK中,ITK::ImageToImageMetricv4对象通过比较图像的灰度强度,定量地度量变换后的moving图像与fixed图像的匹配程度。这些metric非常灵活,可以用于任何transform或interpolation方法,不需要将灰度图像缩减为稀疏提取的信息,如边缘。
metric组件可能是配准框架中最关键的元素。选择使用哪种metric标准在很大程度上取决于要解决的配准问题。例如,一些metrics具有较大的捕获范围,而其他metric需要在接近最佳位置的位置进行初始化。此外,一些metric标准只适用于比较从单模图像,而另一些可以处理多模。不幸的是,对于如何选择度量标准没有明确的规则。
matching metric类控制大部分配准过程,因为它处理fixed、moving和virtual图像,以及fixed和moving transforms和interpolators。方法GetValue()可用于在参数中指定的transform参数上评估定量标准。通常,metric抽样点在虚拟格的一个定义区域内。对于每个点,使用指定参数的fixed初始变换和moving变换计算相应的fixed和moving图像位置。然后利用fixed插值器和moving插值器计算在映射位置上的fixed和moving图像的强度。在图3.40和3.41中详细说明了这种映射,假设virtual点阵与fixed图像点阵相同,实际情况通常是这样的。
这些metric还支持基于region-based的评估。 SetFixedImageMask()和SetMovingImageMask()方法可用于将评估metric限制在指定region内。掩码可以是从itk :: SpatialObject派生的任何类型。
基于梯度的优化方案除了需要measure值外,还需要测度对各transform参数的导数。方法GetDerivatives()和GetValueAndDerivatives()可用于获取梯度信息。
以下是ITKv4配准框架中当前可用的metric列表:
- 均方Mean squares
itk::MeanSquaresImageToImageMetricv4 - 相关性Correlation
itk::CorrelationImageToImageMetricv4 - Mutual information by Mattes
itk::MattesMutualInformationImageToImageMetricv4 - Joint histogram mutual information
itk::JointHistogramMutualInformationHistogramImageToImageMetricv4 - Demons metric
itk::DemonsImageToImageMetricv4 - ANTS neighborhood correlation metric
itk::ANTSNeighborhoodCorrelationImageToImageMetricv4
另外,如果您有兴趣使用旧版ITK配准框架,则以下是ITKv3当前可用的metric列表:
- Mean squares
itk::MeanSquaresImageToImageMetric - Normalized correlation
itk::NormalizedCorrelationImageToImageMetric - Mean reciprocal squared difference
itk::MeanReciprocalSquareDifferenceImageToImageMetric - Mutual information by Viola and Wells
itk::MutualInformationImageToImageMetric - Mutual information by Mattes
itk::MattesMutualInformationImageToImageMetric - Kullback Liebler distance metric by Kullback and Liebler
itk::KullbackLeiblerCompareHistogramImageToImageMetric - Normalized mutual information
itk::NormalizedMutualInformationHistogramImageToImageMetric - Mean squares histogram
itk::MeanSquaresHistogramImageToImageMetric - Correlation coefficient histogram
itk::CorrelationCoefficientHistogramImageToImageMetric - Cardinality Match metric
itk::MatchCardinalityImageToImageMetric - Kappa Statistics metric
itk::KappaStatisticImageToImageMetric - Gradient Difference metric
itk::GradientDifferenceImageToImageMetric
fixed图像f(X)和变换后的moving图像(m∘T(X))称为图像A和B。
itk :: MeanSquaresImageToImageMetricv4计算用户定义区域上图像A和B之间强度的均方根平方差:
Ai是图像A的第i个像素, Bi是图像B的第i个像素 ,N是要考虑的像素数。
metric=0表示最好。图像A和B之间的匹配不良会导致metric过大。该metric易于计算,并且具有相对较大的捕获半径。
这个metric依赖于这样的假设,即表示单模相同位置点的强度必须在两幅图像中相同。因此,它的使用被限制在单模图像。此外,任何强度的线性变化都会导致较差的匹配值。
Exploring a Metric
熟悉作为成本函数的metric的特征是找到建立优化过程的最佳方法的基础,该过程将使用这个metric来解决配准问题。
这一过程有助于识别给定参数范围内的度量可能有噪声,而且它还将给出优化器在探索参数空间时可能陷入的局部极小值或极大值的数量。
图3.44:多平移情况下图像与自身比较的Mean Squares Metric图。
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkMeanSquaresImageToImageMetricv4.h"//metric、transform、interpolator头文件
#include "itkTranslationTransform.h"
#include "itkNearestNeighborInterpolateImageFunction.h"
int
main(int argc, char * argv[])
{
if (argc < 3)
{
std::cerr << "Usage: " << std::endl;
std::cerr << argv[0] << " fixedImage movingImage" << std::endl;
return EXIT_FAILURE;
}
constexpr unsigned int Dimension = 2;//为metric评价的dimension和pixel type
using PixelType = float;
using ImageType = itk::Image<PixelType, Dimension>;
using ReaderType = itk::ImageFileReader<ImageType>;
ReaderType::Pointer fixedReader = ReaderType::New();
ReaderType::Pointer movingReader = ReaderType::New();
fixedReader->SetFileName(argv[1]);
movingReader->SetFileName(argv[2]);
try
{
fixedReader->Update();
movingReader->Update();
}
catch (const itk::ExceptionObject & excep)
{
std::cerr << "Exception catched !" << std::endl;
std::cerr << excep << std::endl;
}
using MetricType =
itk::MeanSquaresImageToImageMetricv4<ImageType, ImageType>;//fixed和moving的图像类型一致
MetricType::Pointer metric = MetricType::New();
using TransformType = itk::TranslationTransform<double, Dimension>;//实例化transform、interpolator类型,创建每个类别的对象
TransformType::Pointer transform = TransformType::New();
using InterpolatorType =
itk::NearestNeighborInterpolateImageFunction<ImageType, double>;
InterpolatorType::Pointer interpolator = InterpolatorType::New();
transform->SetIdentity();
ImageType::ConstPointer fixedImage = fixedReader->GetOutput();
ImageType::ConstPointer movingImage = movingReader->GetOutput();
metric->SetTransform(transform);//metric连接fixed、moving和interpolator、transform。此时SetTransform与SetMovingTransform等价
metric->SetMovingInterpolator(interpolator);
metric->SetFixedImage(fixedImage);
metric->SetMovingImage(movingImage);
metric->SetVirtualDomainFromImage(fixedImage);//在此示例中,无需使用SetFixedTransform(),因为假定virtual域与以下设置的fixed图像域相同。
try
{
metric->Initialize();
}
catch (const itk::ExceptionObject & excep)
{
std::cerr << "Exception catched !" << std::endl;
std::cerr << excep << std::endl;
return EXIT_FAILURE;
}
MetricType::MovingTransformParametersType displacement(Dimension);//最后选取一个参数空间区域进行探讨。在本例中,我们使用的是2D中的平移变换,因此我们只需在x和y中选择从负位置到正位置的平移。
constexpr int rangex = 50;
constexpr int rangey = 50;
for (int dx = -rangex; dx <= rangex; dx++)
{
for (int dy = -rangey; dy <= rangey; dy++)
{
displacement[0] = dx;
displacement[1] = dy;
metric->SetParameters(displacement);
const double value = metric->GetValue();
std::cout << dx << " " << dy << " " << value << std::endl;
}
}
return EXIT_SUCCESS;
}
3.11.2 Normalized Correlation Metric
itk::CorrelationImageToImageMetricv4计算pixel-wise cross-correlation,并通过图像自相关的平方根进行归一化:
Ai是图像A的第i个像素
Bi为图像B的第i个像素
N是考虑的像素个数
注意metric计算中的-1因子。该因子用于使度metric到最小值时达到最优。metric的最优值是- 1。图像之间的不对齐导致测量值较小。该度量的使用仅限于使用单模图像。该metric对两幅图像之间的乘法因子不敏感。这个metric产生一个具有尖峰和明确定义的极小值的成本函数。另一方面,它的捕获半径相对较小。
3.11.3 Mutual Information Metric
itk::MattesMutualInformationImageToImageMetricv4计算图像A和图像b之间的互信息。互信息(MI)衡量一个随机变量(在一幅图像的图像强度)与另一个随机变量(在另一幅图像的图像强度)信息多少。使用MI的主要优点是不需要指定依赖项的实际形式。因此,可以对两幅图像之间的复杂映射进行建模。这种灵活性使得MI非常适合作为多模态注册[46]的标准。
Mutual information是根据熵来定义的。
H(A)是随机变量A的熵,H(B)是随机变量B的熵。
H(A,B)是A和B的联合熵。如果A和B是独立的,则且
但是,如果有依赖关系,则
差值被称为Mutual Information:I(A,B)
Parzen Windowing
图3.43:在Parzen窗口中,以从图像得到的强度样本为中心叠加核函数(本例为高斯函数),构造一个连续的密度函数。
在典型的配准问题中,不能直接获取边缘概率密度和联合概率密度,因此必须从图像数据中估计密度。Parzen窗口(也称为核密度估计器)可以用于此目的。在该方案中,通过从图像中提取强度样本S并对核函数进行叠加来构造密度以S元素为中心的K(·)如图3.43所示:
各种各样的函数可以用来作为光滑核,要求它们是光滑的,对称的,有0的均值和积分1。例如,boxcar、Gaussian和b样条函数都是合适的候选函数。一个平滑参数被用来缩放核函数。平滑参数越大,使用的核函数越广,密度估计也就越平滑。如果参数太大,稠密特性特征将被平滑。另一方面,如果平滑参数太小,产生的密度可能会对噪声敏感。估计由下式给出。
平滑参数的最佳值将取决于数据和所用样本的数量。
Mattes et al. 实现在itk :: MattesMutualInformationImageToImageMetricv4中。
在这个实现中,只从图像中提取一组强度样本。利用该集合,在图像动态范围内的离散位置或均匀分布的bin处评估边缘和联合概率密度函数(PDF)。然后通过对各个bin求和来计算熵值。
所使用的采样数量是样本总数的一个比率,使用直接来自注册框架itk::ImageRegistrationMethodv4的SetMetricSamplingPercentage()方法来设置。同时,通过SetNumberOfHistogramBins()方法在metric类中设置用于计算熵值的bin的数量。
由于fixed图像概率密度函数PDF不贡献的metric导数,它不需要是平滑的。因此,使用零阶(boxcar) b样条核来计算概率密度函数PDF。另一方面,为了保证平滑性,采用三阶b样条核来计算moving图像的强度。与高斯核相比,使用b样条核的优点是b样条核有一个有限的支持区域region。这在计算上很有吸引力,因为每个强度样本只影响少量的bin,因此不需要N×N循环来计算度量值。
在概率密度函数PDF计算期间,图像强度值被线性归一化到0~1。这种调整意味着一个固定的b样条核带宽可以用来处理任意大小和动态范围的图像数据。
3.11.4 Normalized Mutual Information Metric
给定两个图像A和B,可以将归一化的互信息计算为
计算图像的熵H(A),H(B),互信息I(A,B)和联合熵H(A,B)
itk :: DemonsImageToImageMetricv4指标的实现是从itk :: DemonsRegistrationFunction获取的。
可以使用来自fixed图像或moving图像的图像导数来计算度量导数。默认设置为使用fixed图像渐变。请参阅ObjectToObjectMetric :: SetGradientSource更改此行为。
使用强度阈值,为了进行微分计算,在该阈值以下将图像像素视为相等。可通过SetIntensityDifferenceThreshold更改阈值。
请注意,该metric仅支持具有局部支持和具有与moving图像尺寸匹配的多个局部参数的moving变换。特别是,它应与itk :: DisplacementFieldTransform和派生类一起使用。
3.11.6 ANTS neighborhood correlation metric
itk::ANTSNeighborhoodCorrelationImageToImageMetricv4度量使用两个图像之间的每个体素的一个小邻域来计算归一化交叉相关,并对dense配准进行速度优化。
在每个体素周围,邻域被定义为以该体素为中心的n维矩形。矩形的大小是2*radius+1。将fixed图像和moving图像的邻域Normalized correlation在整个图像上平均作为最终metric。小于2的radius是不稳定的。2是默认值。