【ITK库学习】使用itk库进行图像滤波ImageFilter:二阶微分

1、itkRecursiveGaussianImageFliter 递归高斯滤波器

该类用于计算具有高斯核近似值的 IIR 卷积的基类。

在这里插入图片描述
该类是递归滤波器的基类,它与高斯核近似卷积。

与 itkDiscreteGaussianImageFilter相比,此滤波器对于大内核往往更快,并且它可以一步获取模糊图像的导数。 另外,请注意,itkRecursiveGaussianImageFilter 有 SetSigma(),itkDiscreteGaussianImageFilter 有 SetVariance()。

常用的成员函数

  • Set/GetSigma():设置/获取高斯核的Sigma(以世界坐标测量),默认值为 1.0。 如果 Sigma 值小于或等于 0,则会生成异常
  • Set/GetOrder():设置/获取要进行卷积的高斯阶数,ZeroOrder 相当于与高斯卷积,是默认设置;FirstOrder 相当于与高斯的一阶导数进行卷积;SecondOrder 相当于与高斯的二阶导数进行卷积
  • SetZeroOrder():明确设置零阶导数
  • SetFirstOrder():明确设置一阶导数
  • SetSecondOrder():明确设置二阶导数
  • SetNormalizeAcrossScale():设置/获取用于在尺度空间上标准化高斯的标志
  • SetUp():设置滤波器的系数以近似特定的内核,这里它用于近似高斯或其导数之一,参数是沿要过滤的维度的间距
  • VerifyPreconditions():验证过程对象是否已正确配置、所有必需的输入是否已设置以及所需的参数是否已正确设置, 如果无效,将抛出异常

示例代码

(1) 二阶高斯递归

#include "itkImage.h"
#include "itkRecursiveGaussianImageFilter.h"

typedef itk::Image<float, 3> FloatImageType;

bool recursiveGaussianImage(FloatImageType* image, FloatImageType* outputImage, double sigma)
{
    typedef itk::RecursiveGaussianImageFilter<FloatImageType, FloatImageType> RecursiveGaussianFilterType;
   	typename RecursiveGaussianFilterType::Pointer filterA = RecursiveGaussianFilterType::New();
	typename RecursiveGaussianFilterType::Pointer filterB = RecursiveGaussianFilterType::New();
	typename RecursiveGaussianFilterType::Pointer filterC = RecursiveGaussianFilterType::New();
	filterA->SetInput(image);
	filterB->SetInput(filterA->GetOutput());
	filterC->SetInput(filterB->GetOutput());
	filterA->SetSigma(sigma);
	filterB->SetSigma(sigma);
	filterC->SetSigma(sigma);
	filterA->SetDirection(0); // 0 --> X direction
	filterB->SetDirection(1); // 1 --> Y direction
	filterC->SetDirection(2); // 1 --> Z direction
	filterA->SetZeroOrder();    //ZeroOrder  FirstOrder  SecondOrder
	filterB->SetZeroOrder();
	filterC->SetSecondOrder();
	try
	{
		filterC->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}

	outputImage = filterC->GetOutput();
	return true;
}

(2) 拉普拉斯滤波器

#include "itkImage.h"
#include "itkRecursiveGaussianImageFilter.h"
#include "itkAddImageFilter.h"

typedef itk::Image<float, 3> FloatImageType;

//拉普拉斯滤波器
bool laplacianRecursiveGaussian(FloatImageType* image, FloatImageType* outputImage, double sigma)
{
	const bool normalizeAcrossScale = false;
    
    typedef itk::RecursiveGaussianImageFilter<FloatImageType, FloatImageType> RecursiveGaussianFilterType;
	typename RecursiveGaussianFilterType::Pointer filterX1 = RecursiveGaussianFilterType::New();
	typename RecursiveGaussianFilterType::Pointer filterY1 = RecursiveGaussianFilterType::New();

	typename RecursiveGaussianFilterType::Pointer filterX2 = RecursiveGaussianFilterType::New();
	typename RecursiveGaussianFilterType::Pointer filterY2 = RecursiveGaussianFilterType::New();

	filterX1->SetInput(image);
	filterY1->SetInput(filterX1->GetOutput());
	filterY2->SetInput(image);
	filterX2->SetInput(filterY2->GetOutput());

	filterX1->SetDirection(0); // 0 --> X direction
	filterY1->SetDirection(1); // 1 --> Y direction
	filterX2->SetDirection(0); // 0 --> X direction
	filterY2->SetDirection(1); // 1 --> Y direction

	filterX1->SetZeroOrder();
	filterY1->SetSecondOrder();
	filterX2->SetSecondOrder();
	filterY2->SetZeroOrder();

	filterX1->SetNormalizeAcrossScale(normalizeAcrossScale);
	filterY1->SetNormalizeAcrossScale(normalizeAcrossScale);
	filterX2->SetNormalizeAcrossScale(normalizeAcrossScale);
	filterY2->SetNormalizeAcrossScale(normalizeAcrossScale);

	filterX1->SetSigma(sigma);
	filterY1->SetSigma(sigma);
	filterX2->SetSigma(sigma);
	filterY2->SetSigma(sigma);
    
    typedef itk::AddImageFilter<FloatImageType, FloatImageType> AddFiterType;
	typename AddFiterType::Pointer addFilter = AddFiterType::New();
	addFilter->SetInput1(filterY1->GetOutput());
	addFilter->SetInput2(filterX2->GetOutput());
	try
	{
		addFilter->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}
	
	outputImage = addFilter->GetOutput();
	return true;
}

2、itkLapacianRecursiveGaussianImageFiter 拉普拉斯高斯滤波器

该类主要用于计算图像的拉普拉斯高斯 (LoG)。

通过与高斯的二阶导数卷积来计算图像的拉普拉斯高斯 (LoG),该滤波器是使用递归高斯滤波器实现的。

它是包含itkRecursiveGaussianImageFiter的一个便捷的滤波器,可以简化它的使用。

常用的成员函数

  • Set/GetSigma():设置/获取Sigma值, Sigma以图像间距为单位进行测量
  • SetNormalizeAcrossScale():设置/获取用于在尺度空间上归一化的高斯因子

示例代码

#include "itkImage.h"
#include "itkLaplacianRecursiveGaussianImageFilter.h"

typedef itk::Image<float, 3> FloatImageType;

bool laplacianRecursiveGaussianImage(FloatImageType* image,
	FloatImageType* outputImage, double sigma)
{
    typedef itk::LaplacianRecursiveGaussianImageFilter<FloatImageType, FloatImageType> LaplacianRecursiceGaussianFilterType;
	typename LaplacianRecursiceGaussianFilterType::Pointer laplacianRecGauFilter = LaplacianRecursiceGaussianFilterType::New();
	laplacianRecGauFilter->SetInput(image);
	laplacianRecGauFilter->SetNormalizeAcrossScale(false);
	laplacianRecGauFilter->SetSigma(sigma);
	try
	{
		laplacianRecGauFilter->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}

	outputImage = laplacianRecGauFilter->GetOutput();
	return true;
}

  • 28
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值