gpt4 book ai didi

c++ - ITK 快速行进输出

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:50 24 4
gpt4 key购买 nike

我正在使用 ITK 进行一些预处理,我想用 Fast Marching 过滤器和 Geodesic Active Contour 过滤器测试一些东西。我遵循 ITK software guide 中描述的算法, 第 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() );

我正在使用 this paper 中描述的指标哪个目标和我一样。

我有几个问题:

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

谢谢。

最佳答案

好的,我发现了我的问题。 Fast Marching 过滤器确实会输出一个时间穿越图(距离图),但是当我在算法中指定一个停止值时,所有未访问的像素都有一个高值(1.7e+38,因为它是最大值的一半用于输出图像的类型,在我的例子中是 float 的 3.4e+38)。因此,当我使用重新缩放过滤器时,它压缩了我所有的动态图像,结果是一个二值图像。我认为使用 S 形图像作为快速行进滤波器的输入可以获得更好的结果。感谢@nav 的建议。

关于c++ - ITK 快速行进输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24488370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com