梯度计算是图像处理中的一个常见操作。梯度在一些背景下表示梯度向量而在其他情况下可以表示梯度向量的大小。ITK
滤波器在涉及这个概念时通过强度这个概念来区别该不明确概念。ITK
提供可以计算图像梯度向量和图像强度大小的滤波器。
1.梯度强度
像素值大小表示像素位置的梯度大小.
本小节的源代码在文件 Examples/Filtering/GradientMagnitudeImageFilter.cxx
中。图像梯度的强度广泛地应用在图像分析中,主要用来帮助检测对象轮廓和分离均匀区域。itk::GradientMagnitudeImageFilter
使用一个简单的有限差分方式来计算图像中每个像素位置的梯度强度。例如:在二维情况下计算等同于将图像使用模块类型,如下所示:
![](https://img-blog.csdnimg.cn/7e5d610382c84d2da38d7e0af402c310.png)
然后计算它们的平方和并计算和的平方根。
由于在内部使用了 itk::NeighborhoodIterator
和
itk::NeighborhoodOperator
,所以这个滤波器可以对任何维的图像进行操作。
//使用这个滤波器的第一步是包含它的头文件:
#include "itkGradientMagnitudeImageFilter.h"
//必须选择输入和输出图像的像素类型:
typedef float InputPixelType;
typedef float OutputPixelType;
//使用像素类型可以定义输入、输出图像类型:
typedef itk::Image< InputPixelType, 2 > InputImageType;
typedef itk::Image< OutputPixelType, 2 > OutputImageType;
//通过定义输入输出图像类型来定义梯度强度的类型:
typedef itk::GradientMagnitudeImageFilter<
InputImageType, OutputImageType > FilterType;
//通过调用 New( )方式来创建一个滤波器对象并将结果指向一个 itk::SmartPointer:
FilterType::Pointer filter = FilterType::New( );
//输入图像可以从另一个滤波器的输出得到。这里,源于一个图像 reader 来得到:
filter->SetInput( reader->GetOutput( ) );
//最后,通过调用 Update( )方式来执行滤波器:
filter->Update( );
rescaler->SetInput( filter->GetOutput( ) );
writer->SetInput( rescaler->GetOutput( ) );
writer->Update( );
如 6-8
所示阐述了梯度强度滤波器对一个
MRI
脑部图像切片作用的效果。这个图片展示了这个滤波器对噪声数据的灵敏性。
![](https://img-blog.csdnimg.cn/4dda360cd793467cb1dcd8979983ff35.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSs56m7,size_20,color_FFFFFF,t_70,g_se,x_16)
由于梯度强度图像的动态范围往往比输入图像的动态范围要小,所以必须注意选择用来表达输出图像的图像类型。通常,这个规则会产生异常,例如,合成图像包含高对比对象。
这个滤波器在计算梯度前不会对图像进行任何滤波。因此这个结果对噪声非常敏感,而且并不一定是尺度空间分析的最佳选择。
2.带滤波的梯度强度
本小节的源代码在文件 Examples/Filtering/GradientMagnitudeRecursiveGaussianImageFilter.cxx 中。
微分是对一个数字数据的不规则操作。实际中可以方便地定义一个执行微分的比例。在执行这样的滤波时使用一个高斯核被认为是最便捷的选择。通过选择一个特定的高斯标准差 (σ),就可以选择一个相应的比例来去除通常被认为是噪声的高频部分。
itk::GradientMagnitudeRecursiveGaussianImageFilter 计算在每个像素的图像梯度。这个计算过程等同于首先通过将图像和一个高斯核卷积来平滑图像,然后应用一个差分操作。s
的值是由用户选择的。
这些是通过使用一个 IIR
(
Infinite Impulse Response
无限脉冲响应)和高斯核的派生卷积来实现的。传统的卷积将产生一个更精确的结果,但是 IIR
方式更加迅速,尤其是使用大的σ
值。
GradientMagnitudeRecursiveGaussianImageFilter 通过使用高斯核和它的导函数的自然分离来对任何维的图像进行操作。
//使用这个滤波器的第一步是包含它的头文件:
#include "itkGradientMagnitudeRecursiveGaussianImageFilter.h"
//类型必须基于输入和输出图像的像素进行实例化:
typedef float InputPixelType;
typedef float OutputPixelType;
//使用它们就可以对输入、输出图像进行实例化。
typedef itk::Image< InputPixelType, 2 > InputImageType;
typedef itk::Image< OutputPixelType, 2 > OutputImageType;
//现在同时使用输入和输出图像类型来实例化滤波器类型:
typedef itk::GradientMagnitudeRecursiveGaussianImageFilter<
InputImageType, OutputImageType > FilterType;
//通过调用 New( )方式来创建一个滤波器对象并将结果指向一个 itk::SmartPointer。
FilterType::Pointer filter = FilterType::New( );
//输入图像可以从另一个滤波器的输出得到。这里,源自于一个图像 reader 来得到。
filter->SetInput( reader->GetOutput( ) );
//现在设置高斯滤波核的标准差。
filter->SetSigma( sigma );
//最后,通过调用 Update( )方式来执行滤波器:
filter->Update( );
rescaler->SetInput( filter->GetOutput( ) );
writer->SetInput( rescaler->GetOutput( ) );
writer->Update( );
如图 6-9
所示阐述了这个滤波器对一个
MRI
脑部图像切片作用的效果,使用的
σ
值分别为 3
(左图)、
5
(右图)。
由于梯度强度图像的动态范围往往比输入图像的动态范围要小,所以必须注意选择用来表达输出图像的图像类型。
3.不带滤波的导函数
本小节的源代码在文件 Examples/Filtering/DerivativeImageFilter.cxx
中。
使用 itk::DerivativeImageFilter
来计算一幅图像的偏微分——图像沿一个特定的坐标轴方向上的微分。
//首先必须包含这个滤波器相应的头文件:
#include "itkDerivativeImageFilter.h"
//接下来,必须定义输入、输出图像的像素类型,并使用它们实例化图像类型。注意:由于导数值是可正可负的,所以选择的图像应具有符号类型是很重要的。
typedef float InputPixelType;
typedef float OutputPixelType;
const unsigned int Dimension = 2;
typedef itk::Image< InputPixelType, Dimension > InputImageType;
typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
//现在就可以使用图像类型来定义滤波器类型并创建滤波器对象:
typedef itk::DerivativeImageFilter<
InputImageType, OutputImageType > FilterType;
FilterType::Pointer filter = FilterType::New( );
//使用 SetOrder( )方式来选择微分的阶数。使用 SetDirection( )方式来选择计算微分的坐标方向:
filter->SetOrder( atoi( argv[4] ) );
filter->SetDirection( atoi( argv[5] ) );
//可以从任何其他滤波器得到这个滤波器的输入,例如一个 reader。输出可以像一个 writer一样传递给其他滤波器流水线。任何下游的滤波器调用 update 都可以触发微分滤波器的运行。
filter->SetInput( reader->GetOutput( ) );
writer->SetInput( filter->GetOutput( ) );
writer->Update( );
图
6-10
所示阐述了
DerivativeImageFilter
对一个
MRI
脑部图像作用的效果。微分是沿着 x 轴方向来计算的(有方向)。从这个结果可以看出对图像中的噪声的敏感度是很明显的。