【ITK库学习】使用itk库进行图像滤波ImageFilter:保留边缘平滑滤波
目录
1、itkGradientAnisotropicDiffusionImageFilter 梯度各向异性扩散
该滤波器使用经典的 Perona-Malik、基于梯度幅度的方程对标量 itkImage 执行各向异性扩散。
电导系数作为图像在每个电商的一个梯度强度函数来选择,减少边缘像素的扩散强度:
常用的成员函数:
Set/GetNumberOfIterations
:设置/获取迭代次数Set/GetTimeStep
:设置/获取时间步长,2D常用0.125,3D常用0.0625Set/GetConductanceParameter
:设置/获取水平集活动计算的电导系数
示例代码:
#include "itkImage.h"
#include "itkGradientAnisotropicDiffusionImageFilter.h"
typedef itk::Image<float, 3> FloatImageType;
bool gradientAnisotropicDiffusionImageFilter(FloatImageType* image, FloatImageType* outputImage)
{
const int numOfIterations = 5;
const int timeStep = 0.125; //2D常用0.125,3D常用0.0625
const double conductance = 1.0;
typedef itk::GradientAnisotropicDiffusionImageFilter<FloatImageType, FloatImageType> GradientAnisotropicDiffusionFilterType;
typename GradientAnisotropicDiffusionFilterType::Pointer gradientFilter = GradientAnisotropicDiffusionFilterType::New();
gradientFilter->SetInput(image);
gradientFilter->SetNumberOfIterations(numOfIterations); //执行迭代次数
gradientFilter->SetTimeStep(timeStep); //时间步长
gradientFilter->SetConductanceParameter(conductance); //设置水平集活动计算的电导系数
try
{
gradientFilter->Update();
}
catch (itk::ExceptionObject& ex)
{
//读取过程发生错误
std::cerr << "Error: " << ex << std::endl;
return false;
}
outputImage = gradientFilter->GetOutput();
return true;
}
2、itkCurvatureAnisotropicDiffusionImageFilter 曲率各向异性扩散
该滤波器使用改进的曲率扩散方程 (MCDE) 对标量 itkImage 执行各向异性扩散。
此过滤器的输入和输出必须是具有数字像素类型(浮点或双精度)的标量 itkImage,正确定义具有浮点精度的算术运算的用户定义类型也应该给出正确的结果。、
参数
该滤波器的默认时间步长设置为理论上的最大稳定值:0.5 / 2^N,其中N是图像的维数, 对于 2D 图像,这意味着有效时间步长低于 0.1250;对于 3D 图像,有效时间步长低于 0.0625。
MCDE方程为:
其中点到改进曲率系数为:
常用的成员函数:
Set/GetNumberOfIterations
:设置/获取迭代次数Set/GetTimeStep
:设置/获取时间步长,2D常用0.125,3D常用0.0625Set/GetConductanceParameter
:设置/获取水平集活动计算的电导系数
示例代码:
#include "itkImage.h"
#include "itkCurvatureAnisotropicDiffusionImageFilter.h"
typedef itk::Image<float, 3> FloatImageType;
bool CurvatureAnisotropicDiffusionImageFilter(FloatImageType* image, FloatImageType* outputImage)
{
const int numOfIterations = 5;
const int timeStep = 0.0625; //2D常用0.125,3D常用0.0625
const double conductance = 9.0;
typedef itk::CurvatureAnisotropicDiffusionImageFilter<FloatImageType, FloatImageType> CurvatureAnisotropicDiffusionFilterType;
typename CurvatureAnisotropicDiffusionFilterType::Pointer curvatureFilter = CurvatureAnisotropicDiffusionFilterType::New();
curvatureFilter->SetInput(image);
curvatureFilter->SetNumberOfIterations(numOfIterations); //执行迭代次数
curvatureFilter->SetTimeStep(timeStep); //时间步长
curvatureFilter->SetConductanceParameter(conductance); //设置水平集活动计算的电导系数
try
{
curvatureFilter->Update();
}
catch (itk::ExceptionObject& ex)
{
//读取过程发生错误
std::cerr << "Error: " << ex << std::endl;
return false;
}
outputImage = curvatureFilter->GetOutput();
return true;
}
3、itkCurvatureFlowImageFilter 曲率各向异性扩散
该类使用曲率驱动流对图像进行去噪。
它实现曲率驱动的图像去噪算法,灰度输入图像中的等亮度轮廓被视为水平集,然后使用基于曲率的速度函数演化水平集:
其中 κ 是曲率,高曲率的区域比低曲率区域扩散的更快,小的锯齿状失真迅速消失,大范围的截面将活动减慢,从而保留对象的尖锐边界。
这种方法的优点是通过仅在区域内发生平滑来保留清晰的边界。注意:持续应用该方案将导致随着每个轮廓缩小到零并消失,最终删除所有信息。
请注意,与水平集分割算法不同,要去噪的图像已经是水平集,可以使用 SetInput() 方法直接设置为输入。
SetTimeStep时间步长应该“足够小”以确保数值稳定性,当时间步满足CFL(Courant-Friedrichs-Levy)条件时,稳定性得到保证,从广义上讲,这一条件确保每个轮廓在每个时间步不会移动超过一个网格位置,在文献中,时间步长通常是用户指定的,并且必须根据应用程序手动调整。
该滤波器利用多线程有限差分求解器层次结构,使用 CurvatureFlowFunction 对象计算更新,计算数据边界附近的导数时的零通量诺伊曼边界条件。
该过滤器可以被流式传输,为了支持流式传输,该过滤器会产生考虑边缘效应的填充输出,每条边上的填充大小为 m_NumberOfIterations,此过滤器的用户应仅使用中心有效的中心区域。
警告
该滤波器要求输出图像像素为浮点类型,它适用于任何维度图像。
常用的成员函数:
Set/GetNumberOfIterations
:设置/获取迭代次数Set/GetTimeStep
:设置/获取时间步长,2D常用0.125,3D常用0.0625
示例代码:
#include "itkImage.h"
#include "itkCurvatureFlowImageFilter.h"
typedef itk::Image<float, 3> FloatImageType;
bool CurvatureFlowImageFilter(FloatImageType* image, FloatImageType* outputImage)
{
const int numOfIterations = 10;
const int timeStep = 0.0625; //2D常用0.125,3D常用0.0625
typedef itk::CurvatureFlowImageFilter<FloatImageType, FloatImageType> CurvatureFlowFilterType;
typename CurvatureFlowFilterType::Pointer curvatureFilter = CurvatureFlowFilterType::New();
curvatureFilter->SetInput(image);
curvatureFilter->SetNumberOfIterations(numOfIterations); //执行迭代次数
curvatureFilter->SetTimeStep(timeStep); //时间步长
try
{
curvatureFilter->Update();
}
catch (itk::ExceptionObject& ex)
{
//读取过程发生错误
std::cerr << "Error: " << ex << std::endl;
return false;
}
outputImage = curvatureFilter->GetOutput();
return true;
}
4、itkMinMaxCurvatureFlowImageFilter 最大最小曲线流
该类使用最小/最大曲率流对图像进行去噪。
它实现曲率驱动的图像去噪算法,灰度输入图像中的等亮度轮廓被视为水平集,然后使用基于曲率的速度函数演化水平集:
其中F的定义为:
κ 是 x 点等亮度轮廓的平均曲率。
在最小/最大曲率流中,根据想要消除的噪声的大小来打开或关闭运动,切换每个点周围半径为 R 的区域的平均图像值,R(模板半径)的选择决定了要消除的噪声的大小。
阈值Tthreshold是在与局部邻域极值处x点的梯度垂直的方向上获得的平均强度。
该滤波器利用多线程有限差分求解器层次结构,使用 MinMaxCurvatureFlowFunction 对象计算更新,计算数据边界附近的导数时,使用零通量诺依曼边界条件。
警告
该过滤器还要求输出图像像素是真实类型,该过滤器适用于任何维度图像,但是对于大于 3D 的维度,需要使用昂贵的强力搜索来计算局部阈值。
常用的成员函数:
Set/GetNumberOfIterations
:设置/获取迭代次数Set/GetTimeStep
:设置/获取时间步长,2D常用0.125,3D常用0.0625Set/GetStencilRadius()
:设置/获取模板半径
示例代码:
#include "itkImage.h"
#include "itkMinMaxCurvatureFlowImageFilter.h"
typedef itk::Image<float, 3> FloatImageType;
bool minMaxCurvatureFlowImageFilter(FloatImageType* image, FloatImageType* outputImage)
{
const int numOfIterations = 10;
const int timeStep = 0.0625; //2D常用0.125,3D常用0.0625
const int radius = 1;
typedef itk::MinMaxCurvatureFlowImageFilter<FloatImageType, FloatImageType> MinMaxCurvatureFlowFilterType;
typename MinMaxCurvatureFlowFilterType::Pointer minMaxCurFilter = MinMaxCurvatureFlowFilterType::New();
minMaxCurFilter->SetInput(image);
minMaxCurFilter->SetStencilRadius(radius); //设置模板半径
minMaxCurFilter->SetNumberOfIterations(numOfIterations); //执行迭代次数
minMaxCurFilter->SetTimeStep(timeStep); //时间步长
try
{
minMaxCurFilter->Update();
}
catch (itk::ExceptionObject& ex)
{
//读取过程发生错误
std::cerr << "Error: " << ex << std::endl;
return false;
}
outputImage = minMaxCurFilter->GetOutput();
return true;
}
5、itkBilateralImageFilter 双边滤波器
该类用于模糊图像,同时保留边缘。
该过滤器使用双边过滤来使用域(domain)和范围(range)“邻域”来模糊图像,使用与图像域中的像素接近并且与图像范围中的像素相似的像素来计算滤波值,使用两个高斯核(一个在图像域中,一个在图像范围中)来平滑图像,结果是图像在均匀区域被平滑但保留了边缘,结果类似于各向异性扩散,但以非迭代方式实现,双边滤波的另一个好处是任何距离度量都可以用于内核平滑图像范围,因此,可以使用强度值之间的 CIE 距离作为相似性度量(使用 CIE 距离评估图像域的高斯核),将彩色图像平滑为矢量图像。
双边滤波能够在保持边缘的同时将图像中的噪声降低一个数量级。它的另一个优点是可以对核使用任何以米为单位距离来平滑图像范围。
常用的成员函数:
Set/GetDomainSigma
:设置/获取高斯模糊核在每个维度方向上的标准差,单位与图像间距单位匹配Set/GetRangeSigma
:设置/获取图像范围内高斯模糊核的标准差,单位是强度Set/GetRadius()
:设置/获取内核半径,以像素为单位指定, 仅当AutomaticNeighborhoodSize 为“off”时才使用此参数Set/GetAutomaticKernelSize()
:设置/获取自动内核大小,当自动设置为“On”时,内核大小是域 sigma 的函数,当自动设置为“Off”时,内核大小为用户指定的大小Set/GetNumberOfRangeGaussianSamples()
:设置/获取用于范围平滑的高斯近似值中的样本数,仅在[0, 4*m_RangeSigma]范围内生成样本,默认值为 100
示例代码:
#include "itkImage.h"
#include "itkBilateralImageFilter.h"
typedef itk::Image<float, 3> FloatImageType;
bool bilateralImageFilter(FloatImageType* image, FloatImageType* outputImage)
{
const int domainSigma = 5.0;
const int rangeSigma = 6.0;
typedef itk::BilateralImageFilter<FloatImageType, FloatImageType> BilateralFilterType;
typename BilateralFilterType::Pointer bilateralFilter = BilateralFilterType::New();
bilateralFilter->SetInput(image);
bilateralFilter->SetDomainSigma(domainSigma);
bilateralFilter->SetRangeSigma(rangeSigma);
try
{
bilateralFilter->Update();
}
catch (itk::ExceptionObject& ex)
{
//读取过程发生错误
std::cerr << "Error: " << ex << std::endl;
return false;
}
outputImage = bilateralFilter->GetOutput();
return true;
}
总结
这几个图像滤波器都是用于图像平滑和去噪的。它们的共同之处是都基于偏微分方程,并在处理图像时使用邻域信息。
-
itkCurvatureAnisotropicDiffusionImageFilter
和itkGradientAnisotropicDiffusionImageFilter
是基于偏微分方程的扩散过滤器,用于平滑和去除图像中的噪声,它们使用了图像的梯度信息来控制扩散的方向和速度,从而保留边界的同时平滑图像,这两个滤波器的主要区别在于扩散的计算方式和方向。 -
itkCurvatureFlowImageFilter
也是一种基于偏微分方程的滤波器,用于平滑图像,这个滤波器通过计算图像的平均曲率流来平滑图像,使得边界变得更加平滑,适合对边缘较多、噪声较少的图像进行平滑处理 -
itkMinMaxCurvatureFlowImageFilter
使用的是MinMax Curvature Flow算法,该算法在Curvature Flow的基础上,引入了局部窗口的最大/最小值来对像素进行平滑调整,从而更好地去除噪声,它的优点是能够更有效地滤除图像中的噪声,但在一些情况下可能会造成平滑边缘的失真,比较适合对噪声较多的图像进行平滑处理。 -
itkBilateralImageFilter
是一种基于距离和灰度值的滤波器,用于平滑图像的同时保留边缘信息,它根据像素之间的灰度值相似性和空间距离来计算权重,并根据这些权重对像素进行平滑,该滤波器通过同时考虑空间距离和强度差异来平滑图像。
这些滤波器的应用场景包括图像去噪、边缘保留、纹理增强等,具体选择哪个滤波器取决于应用的需求和图像特点。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!