目錄
- 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可以用于圖像邊緣檢測、角點檢測等應用,具體選擇哪個濾波器還需根據具體應用場景和需求來確定。