ITK快速行军输出

ITK Fast Marching output

本文关键字:输出 ITK      更新时间:2023-10-16

我使用ITK做一些预处理,我想用快速行进滤波器和测地线活动轮廓滤波器测试一些东西。我遵循ITK软件指南第9.3.3节中描述的算法。然而,我没有得到预期的结果。我正在处理一个3D图像。

下面是我的代码:
AnisotropicDiffusionFilter::Pointer anisotropic_filter = AnisotropicDiffusionFilter::New();
anisotropic_filter->SetInput(itk_image_in);
anisotropic_filter->SetTimeStep(0.0625);
anisotropic_filter->SetNumberOfIterations(5);
anisotropic_filter->SetConductanceParameter(3.0); 
anisotropic_filter->Update();
 
GradientFilter::Pointer gradient_filter = GradientFilter::New();
gradient_filter->SetInput(anisotropic_filter->GetOutput());
gradient_filter->SetSigma(0.5);
gradient_filter->Update();
 
SigmoidFilter::Pointer sigmoid_filter = SigmoidFilter::New();
sigmoid_filter->SetInput(gradient_filter->GetOutput());
sigmoid_filter->SetOutputMinimum(0.0);
sigmoid_filter->SetOutputMaximum(1.0);
sigmoid_filter->SetAlpha(-1.5);
sigmoid_filter->SetBeta(4.0);
sigmoid_filter->Update();
 
FastMarchingFilter::Pointer fast_marching = FastMarchingFilter::New();
NodeContainer::Pointer seeds = NodeContainer::New();
Node node;
const double seedValue = -50.0;
node.SetValue(seedValue);
seeds->Initialize();
 
vector<GeoVec3s>::iterator it = m_clicks_.begin();
int i=0;
for(; it != m_clicks_.end(); it++)
{
    itkIndex index;
    index[0] = (*it)[0];
    index[1] = (*it)[1];
    index[2] = (*it)[2];
    node.SetIndex(index);
    seeds->InsertElement(i++, node);
}
fast_marching->SetTrialPoints(seeds);
fast_marching->SetSpeedConstant(1.0);
fast_marching->SetStoppingValue(100);
//fast_marching->SetInput(sigmoid_filter->GetOutput());
fast_marching->SetOutputSize(sigmoid_filter->GetOutput()->GetBufferedRegion().GetSize());
fast_marching->Update();
 
GeodesicFilter::Pointer geodesic_filter = GeodesicFilter::New();
geodesic_filter->SetInput(fast_marching->GetOutput());
geodesic_filter->SetFeatureImage(sigmoid_filter->GetOutput());
 
geodesic_filter->SetPropagationScaling(0.5);
geodesic_filter->SetCurvatureScaling(5.0);
geodesic_filter->SetAdvectionScaling(1.0);
geodesic_filter->SetMaximumRMSError( 0.02 );
geodesic_filter->Update();
 
BinaryThresholdFilter::Pointer thresholder = BinaryThresholdFilter::New();
thresholder->SetLowerThreshold(-1000);
thresholder->SetUpperThreshold(0);
thresholder->SetOutsideValue(0);
thresholder->SetInsideValue(255);
thresholder->SetInput( geodesic_filter->GetOutput() );

我正在使用本文中描述的指标,其目标与我的目标相同。

我有几个问题:

  1. 快速行进滤波器应该输出距离图对吗?相反,当我将音量输出到一系列png(值在0到4095之间)时,我得到了一个二值图像(像素为0或4095)。我认为我应该得到一个灰度体积,表明从种子获得每个像素所需的时间。
  2. 按照Suzuki所描述的程序,我成功地使算法或多或少地工作,但我改变了测地线滤波器的参数值。我不记得确切的数值了,但它与论文中描述的不太接近。当我们处理在0和1之间归一化的s型输入时,会发生什么?
  3. 对于快速行进滤波器还是s形图像,我应该使用恒速函数吗?什么时候应该使用这两种方法?
  4. 我使用一个重新缩放器来输出我的浮动图像(从过滤器输出)。这就是我看到的不一致的原因吗?
  5. 有什么建议,我可以做错了吗?

谢谢。

好了,我找到我的问题了。Fast Marching filter确实输出一个时间交叉贴图(距离贴图),但是当我在算法中指定一个停止值时,所有未访问的像素都有一个高值(1.7e+38,因为它是用于输出图像的类型的最大值的一半,在我的情况下是浮动的3.4e+38)。所以当我使用缩放滤镜时,它会动态压缩我所有的图像,结果是一个二值图像。我认为使用s形图像作为快速行军滤波器的输入可以获得更好的结果。谢谢@nav的建议