【ITK库学习】使用itk库进行图像滤波ImageFilter:模糊降噪
目录
图像模糊可以削弱图像频谱的高频部门
1、itkDiscreteGaussianImageFilter 离散高斯
该类通过图像与离散高斯算子(内核)的可分离卷积来模糊图像。
如果 SetUseImageSpacing 关闭(false),则方差或标准差 (sigma) 将被评估为像素单位;如果 SetUseImageSpacing 开启(true,默认值),则方差或标准差 (sigma) 将被评估为物理单位。 方差可以在每个维度上独立设置。
常用的成员函数:
Set/GetSigma()
:设置用于平滑的高斯的标准差,Sigma以图像间距为单位进行测量Set/GetSigmaArray()
:保留 SetSigmaArray 以实现接口向后兼容性SetVariance()
:离散高斯核的方差,为每个维度独立设置方差,每个维度的默认值为 0.0,如果 UseImageSpacing为 true,则单位是图像的物理单位,如果 UseImageSpacing 为 false,则单位为像素Set/GetUseImageSpacing()
:设置/获取过滤器是否在计算中使用输入图像的间距,参数为bool,true(On):考虑图像间距信息并指定现实世界单位中的高斯方差;false(Off):忽略图像间距并以体素单位指定高斯方差,默认为OnSetUseImageSpacingOn/Off()
:同上Set/GetMaximumKernelWidth()
:设置内核最大宽度像素值,即使MaximumError需要,默认值为 32 像素Set/GetMaximumError()
:调整离散内核的大小,以便内核截断产生的误差不大于 MaximumError, 每个维度的默认值为 0.01Set/GetInputBoundaryCondition()
:设置/获取边界条件Set/GetRealBoundaryCondition()
:设置/获取边界条件Set/GetFilterDimensionality()
:设置平滑维度数,默认为图像维度,可以设置为小于图像Dimension,平滑所有小于FilterDimensionality的尺寸,例如,只需平滑3D数据的切片而不在 Z 轴上平滑,则将 FilterDimensionality 设置为 2GetKernelRadius()
:获取每个方向上可分离核的半径GetKernelSize()
:获取每个方向上可分离核的大小,公式:KernelSize[i] = KernelRadius[i] * 2 + 1GetKernelVarianceArray()
:获取方差,可选择根据像素间距进行调整
示例代码:
#include "itkImage.h"
#include "itkDiscreteGaussianImageFilter.h"
typedef itk::Image<float, 3> FloatImageType;
bool discreteGaussianImageFilter(FloatImageType* image, FloatImageType* outputImage)
{
const double gaussianVariance = 2.0;
const int maxKernelWidth = 32;
typedef itk::DiscreteGaussianImageFilter<FloatImageType, FloatImageType> DiscreteGaussianFilterType;
typename DiscreteGaussianFilterType::Pointer discreteGauFilter = DiscreteGaussianFilterType::New();
discreteGauFilter->SetInput(image);
discreteGauFilter->SetVariance(gaussianVariance);
discreteGauFilter->SetMaximumKernelWidth(32);
discreteGauFilter->SetUseImageSpacing(true);
try
{
discreteGauFilter->Update();
}
catch (itk::ExceptionObject& ex)
{
//读取过程发生错误
std::cerr << "Error: " << ex << std::endl;
return false;
}
outputImage = discreteGauFilter->GetOutput();
return true;
}
itkDiscreteGaussianImageFilter和itkRecursiveGaussianImageFilter都是都是用于图像滤波的高斯滤波器。
相同之处:在于都可以通过设置标准差参数来控制滤波的效果。
不同之处:
itkDiscreteGaussianImageFilter
:是通过离散卷积的方式来计算高斯滤波,使用离散的高斯核进行像素值的加权平均,在实现上是基于卷积操作的,基于卷积的方法可以保留图像中的边缘信息,并且滤波时不会引入额外的图像数据依赖,其结果近似于连续高斯滤波,该类需要进行完整的离散卷积计算,计算成本较高,可以通过设置像素距离和变换到频率域等参数来调整滤波器的行为itkRecursiveGaussianImageFilter
使用递归的高斯核进行滤波,将二维高斯滤波分解成一维高斯滤波的连续求和,从而实现递归滤波的方法,由于它可以在空间域上利用中间结果进行优化,递归滤波的方法可以有效地减少计算量,并且在处理大图像时具有更高的效率,然而,递归滤波方法在滤波过程中会引入额外的图像数据依赖,因此可能会导致边界像素的变化,主要通过设置标准差来控制高斯核的大小和强度。
2、itkBinomialBlurImageFilter 二项式模糊
该类可以对图像的每个维度执行可分离的模糊。
二项式模糊由每个图像维度上的最近邻平均值组成,沿每个维度来计算一个最接近的邻域平均,理论上,经过n 次迭代后的最终结果接近高斯卷积。
常用的成员函数:
Set/GetRepetitions()
:设置/获取重复过滤的次数
示例代码:
#include "itkImage.h"
#include "itkBinomialBlurImageFilter.h"
typedef itk::Image<float, 3> FloatImageType;
bool binomialBlurImageFilter(FloatImageType* image, FloatImageType* outputImage, int repetitions)
{
typedef itk::BinomialBlurImageFilter<FloatImageType, FloatImageType> BinomialBlurFilterType;
typename BinomialBlurFilterType::Pointer binmialBlurFilter = BinomialBlurFilterType::New();
binmialBlurFilter->SetInput(image);
binmialBlurFilter->SetRepetitions(repetitions);
try
{
binmialBlurFilter->Update();
}
catch (itk::ExceptionObject& ex)
{
//读取过程发生错误
std::cerr << "Error: " << ex << std::endl;
return false;
}
outputImage = binmialBlurFilter->GetOutput();
return true;
}
3、itkSmoothingRecursiveGaussianImageFilter
该类通过与实现为IIR滤波器的高斯核进行卷积来计算图像的平滑度。
该滤波器是使用递归高斯滤波器实现的,对于多分量图像,过滤器独立地作用于每个分量。
常用的成员函数:
Set/GetSigma()
:设置/获取用于平滑的高斯的标准差,Sigma以图像间距为单位进行测量,可以使用 SetSigma方法在每个轴上设置相同的值,或者如果需要沿每个轴使用不同的值,则可以使用 SetSigmaArraySet/GetSigmaArray()
:设置/获取每个轴向的Sigma值Set/GetNumberOfWorkUnits()
:设置/获取要创建的工作单元的数量Set/GetNormalizeAcrossScale()
:设置/获取用于在尺度空间上标准化高斯的标志,此方法不会影响该过滤器的输出NormalizeAcrossScaleOn/Off()
:同上
示例代码:
#include "itkImage.h"
#include "itkSmoothingRecursiveGaussianImageFilter.h"
typedef itk::Image<float, 3> FloatImageType;
bool smoothingRecursiveGaussianImageFilter(FloatImageType* image, FloatImageType* outputImage, double sigma)
{
typedef itk::SmoothingRecursiveGaussianImageFilter<FloatImageType, FloatImageType> SmoothingRecGauFilterType;
typename SmoothingRecGauFilterType::Pointer smoothingFilter = SmoothingRecGauFilterType::New();
smoothingFilter->SetInput(image);
smoothingFilter->SetSigma(sigma);
//const itk::FixedArray<double, 3U> sigmaArry;
//smoothingFilter->SetSigmaArray(sigmaArry);
try
{
smoothingFilter->Update();
}
catch (itk::ExceptionObject& ex)
{
//读取过程发生错误
std::cerr << "Error: " << ex << std::endl;
return false;
}
outputImage = smoothingFilter->GetOutput();
return true;
}
此类与itkRecursiveGaussianImageFilter滤波器相比,它们都是用于对图像进行高斯平滑处理的滤波器,区别在于实现方式。
-
itkRecursiveGaussianImageFilter
滤波器是使用递归的方式计算高斯卷积,通过将二维高斯核分解为一维核进行计算,可以有效地减少计算量和内存使用,递归高斯滤波器具有线性计算复杂度,适用于平滑大尺寸图像。 -
itkSmoothingRecursiveGaussianImageFilter
滤波器是基于itkRecursiveGaussianImageFilter滤波器进行改进的,主要是在高斯平滑的过程中引入了一个缩放因子,用于控制滤波器的平滑程度,可以灵活地调节滤波器的参数,使得滤波结果更符合需求。
因此,itkSmoothingRecursiveGaussianImageFilter滤波器相对于itkRecursiveGaussianImageFilter滤波器而言,更加灵活,可以得到更多种类的平滑结果。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!