目录
- 1、itkGradientImageFilter
- 2、itkGradientMagnitudeImageFilter 梯度强度
- 3、itkGradientMagnitudeRecursiveGaussianImageFilter 带滤波的梯度强度
- 4、itkDerivativeImageFilter 不带滤波的导函数
1、itkGradientImageFilter
该类是一个基类,用于使用方向导数计算图像的梯度向量。
每个像素位置的方向导数是通过与一阶导数算子卷积来计算的。
itk::GradientImageFilter< TInputImage, TOperatorValueType, TOutputValueType,TOutputImageType >
TOperatorValueType:定义导数运算符中使用的值类型(默认为浮点型),TOutputValueType定义用于输出图像的值类型(默认为浮点型), 输出图像被定义为协变矢量图像,其值类型被指定为第三个模板参数。
示例代码:
#include "itkImage.h"
#include "itkGradientImageFilter.h"typedef itk::Image<float, 2> FloatImageType;
typedef itk::Image<unsigned char, 2> UnsignedCharImageType;bool gradientImage(UnsignedCharImageType* image)
{using GradientFilterType = itk::GradientImageFilter<UnsignedCharImageType, float>;auto gradientFilter = GradientFilterType::New();gradientFilter->SetInput(image);try{gradientFilter->Update();}catch (itk::ExceptionObject& ex){//读取过程发生错误std::cerr << "Error: " << ex << std::endl;return false;}return true;
}
2、itkGradientMagnitudeImageFilter 梯度强度
该类是itk::GradientImageFilter
的一个具体实现,用于计算图像的梯度的幅值,即对应每个像素位置处的梯度的长度。
该类只计算梯度幅值,不涉及梯度向量的方向,主要用来帮助检测对象轮廓和分离均匀区域。
它使用一个简单的有限差分方式进行计算梯度强度。该滤波器在计算梯度前不会对图像进行任何滤波,因此结果对噪声非常敏感,而且不一定是尺度空间分析的最佳选择。
示例代码:
#include "itkImage.h"
#include "itkGradientMagnitudeImageFilter.h"typedef itk::Image<float, 3> FloatImageType;bool gradientMagnitudeImage(FloatImageType* image, FloatImageType* outputImage)
{typedef itk::GradientMagnitudeImageFilter<FloatImageType, FloatImageType> GradientMagnitudeFilterType;typename GradientMagnitudeFilterType::Pointer gradientMagnitudeFilter = GradientMagnitudeFilterType::New();gradientMagnitudeFilter ->SetInput(image);try{gradientMagnitudeFilter ->Update();}catch (itk::ExceptionObject& ex){//读取过程发生错误std::cerr << "Error: " << ex << std::endl;return false;}outputImage = gradientMagnitudeFilter->GetOutput();return true;
}
3、itkGradientMagnitudeRecursiveGaussianImageFilter 带滤波的梯度强度
该类通过与高斯的一阶导数卷积来计算图像的梯度大小。
通过选择一个特定的高斯标准差,就可以选择一个相应的比例来去除通常被认为是噪声的高频部分。
该滤波器是使用递归高斯滤波器实现的。首先通过将图像和一个高斯核卷积来平滑图像,然后应用一个查分操作。
常用的成员函数:
SetImage()
:设置输入图像Set/GetSigma()
:设置/获取Sigma值, Sigma以图像间距为单位进行测量Set/GetNumberOfWorkUnits()
:获取/设置执行时要创建的工作单元数Set/GetNormalizeAcrossScale()
:设置/获取将用于高斯的归一化因子
注:梯度强度图像的动态范围往往比输入图像的动态范围小,必须注意选择用来输出图像的图像类型。
示例代码:
#include "itkImage.h"
#include "itkGradientMagnitudeRecursiveGaussianImageFilter.h"typedef itk::Image<float, 3> FloatImageType;bool gradientMagnitudeRecursiveImage(FloatImageType* image, FloatImageType* outputImage)
{const double sigma = 3;typedef itk::GradientMagnitudeRecursiveGaussianImageFilter<FloatImageType, FloatImageType> GradMagnRecFilterType;typename GradMagnRecFilterType::Pointer gradMagnRecFilter = GradMagnRecFilterType::New();gradMagnRecFilter->SetInput(image);gradMagnRecFilter->SetSigma(sigma);try{gradMagnRecFilter->Update();}catch (itk::ExceptionObject& ex){//读取过程发生错误std::cerr << "Error: " << ex << std::endl;return false;}outputImage = gradMagnRecFilter->GetOutput();return true;
}
4、itkDerivativeImageFilter 不带滤波的导函数
该类主要用于计算图像的方向导数。
每个像素位置的方向导数是通过与用户指定阶数的导数运算符进行卷积来计算的。
常用的成员函数:
SetImage()
:设置输入图像SetOrder()
:设置/获取导数的阶数,输出像素类型必须有符号SetDirection()
:设置/获取导数相对于图像坐标轴的方向,输出像素类型必须有符号
示例代码:
#include "itkImage.h"
#include "itkDerivativeImageFilter.h"typedef itk::Image<float, 3> FloatImageType;bool derivativeImage(FloatImageType* image, FloatImageType* outputImage)
{const unsigned int order = 1;const unsigned int direction = 0; //dimension number,0:x; 1:y; 2:z;typedef itk::DerivativeImageFilter<FloatImageType, FloatImageType> DerivativeFilterType;typename DerivativeFilterType::Pointer derivativeFilter = DerivativeFilterType::New();derivativeFilter->SetInput(image);derivativeFilter->SetDirection(direction);derivativeFilter->SetOrder(order);try{derivativeFilter->Update();}catch (itk::ExceptionObject& ex){//读取过程发生错误std::cerr << "Error: " << ex << std::endl;return false;}outputImage = derivativeFilter->GetOutput();return true;
}
综上所述,几个滤波器均适用于计算二维和三维图像的计算,如果只需要计算图像的梯度幅值可以选择itkGradientMagnitudeImageFilter或itkGradientMagnitudeRecursiveGaussianImageFilter;如果需要计算图像的导数,可以选择itkDerivativeImageFilter可以用于图像边缘检测、角点检测等应用,具体选择哪个滤波器还需根据具体应用场景和需求来确定。