使用ITK计算图像梯度的错误结果

时间:2011-09-28 12:02:41

标签: c++ gradient vtk itk

在头文件中,我声明了所有这些类型,“Gradient ImageFilter”用于计算2D图像的渐变,“VectorIndexSelectionCastImageFilter”用于选择渐变的“x”和“y”分量计算,因为计算梯度的结果是矢量图像。

typedef double      operatorValueType;
typedef double      outputValueType;
typedef double      InputPixelType;
typedef  itk::Image<InputPixelType, 2> InputImageType;
typedef  itk::GradientImageFilter< InputImageType, operatorValueType, outputValueType>     GradientFilterType;
//for extracting a scalar from the vector image
typedef double       OutputPixelTypeImage;
typedef double       ComponentType;
typedef  itk::CovariantVector<ComponentType,2> OutputPixelType;
typedef  itk::Image <OutputPixelType, 2> OutputImageType;
typedef  itk::VectorIndexSelectionCastImageFilter<OutputImageType,InputImageType> SelectionFilterType; // < intputType , outputType>

声明之后,代码的主要部分如下:

GradientFilterType::Pointer gradientFilter = GradientFilterType::New();
gradientFilter->SetInput(T_g->GetOutput());  // From T_g (is a reader) comes the image
gradientFilter->Update();

SelectionFilterType::Pointer componentExtractor_x = SelectionFilterType::New();
SelectionFilterType::Pointer componentExtractor_y = SelectionFilterType::New();

componentExtractor_x->SetIndex(0);// x component of the gradient
componentExtractor_y->SetIndex(1);// y component of the gradient

componentExtractor_x->SetInput(gradientFilter->GetOutput());
componentExtractor_y->SetInput(gradientFilter->GetOutput());

componentExtractor_x->Update();
componentExtractor_y->Update();

似乎一切正常,但问题是当我读取图像并将其与Matlab中的渐变计算(我认为是正确的)进行比较时,结果完全不同......任何人之前都使用过“VectorIndexSelectionCastImageFilter”看到奇怪的东西?或者在计算梯度的过程中?

非常感谢!

安东尼奥

2 个答案:

答案 0 :(得分:2)

ITK应该尊重计算中的体素间距。你的图像是否具有各向同性的单位间距?

这可以解释与matlab的差异。

答案 1 :(得分:1)

问题在于图像的间距,只需添加以下行:

gradientFilter->SetUseImageSpacingOff(); // for derivation in isotropic pixel space

问题得到解决,推导在各向同性空间中完成