ITK快速行军输出
ITK Fast Marching output
我使用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() );
我正在使用本文中描述的指标,其目标与我的目标相同。
我有几个问题:
- 快速行进滤波器应该输出距离图对吗?相反,当我将音量输出到一系列png(值在0到4095之间)时,我得到了一个二值图像(像素为0或4095)。我认为我应该得到一个灰度体积,表明从种子获得每个像素所需的时间。
- 按照Suzuki所描述的程序,我成功地使算法或多或少地工作,但我改变了测地线滤波器的参数值。我不记得确切的数值了,但它与论文中描述的不太接近。当我们处理在0和1之间归一化的s型输入时,会发生什么?
- 对于快速行进滤波器还是s形图像,我应该使用恒速函数吗?什么时候应该使用这两种方法?
- 我使用一个重新缩放器来输出我的浮动图像(从过滤器输出)。这就是我看到的不一致的原因吗?
- 有什么建议,我可以做错了吗?
谢谢。
好了,我找到我的问题了。Fast Marching filter确实输出一个时间交叉贴图(距离贴图),但是当我在算法中指定一个停止值时,所有未访问的像素都有一个高值(1.7e+38,因为它是用于输出图像的类型的最大值的一半,在我的情况下是浮动的3.4e+38)。所以当我使用缩放滤镜时,它会动态压缩我所有的图像,结果是一个二值图像。我认为使用s形图像作为快速行军滤波器的输入可以获得更好的结果。谢谢@nav的建议
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么rk4.do_step不输出C++中的初始条件
- 输出没有重复元素的动态数组(收缩数组)C++
- ITK快速行军输出