【ITK库学习】使用itk库进行图像滤波ImageFilter:模糊降噪

2023-12-12 21:36

本文主要是介绍【ITK库学习】使用itk库进行图像滤波ImageFilter:模糊降噪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1、itkDiscreteGaussianImageFilter 离散高斯
  • 2、itkBinomialBlurImageFilter 二项式模糊
  • 3、itkSmoothingRecursiveGaussianImageFilter

图像模糊可以削弱图像频谱的高频部门

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):忽略图像间距并以体素单位指定高斯方差,默认为On
  • SetUseImageSpacingOn/Off():同上
  • Set/GetMaximumKernelWidth():设置内核最大宽度像素值,即使MaximumError需要,默认值为 32 像素
  • Set/GetMaximumError():调整离散内核的大小,以便内核截断产生的误差不大于 MaximumError, 每个维度的默认值为 0.01
  • Set/GetInputBoundaryCondition():设置/获取边界条件
  • Set/GetRealBoundaryCondition():设置/获取边界条件
  • Set/GetFilterDimensionality():设置平滑维度数,默认为图像维度,可以设置为小于图像Dimension,平滑所有小于FilterDimensionality的尺寸,例如,只需平滑3D数据的切片而不在 Z 轴上平滑,则将 FilterDimensionality 设置为 2
  • GetKernelRadius():获取每个方向上可分离核的半径
  • GetKernelSize():获取每个方向上可分离核的大小,公式:KernelSize[i] = KernelRadius[i] * 2 + 1
  • GetKernelVarianceArray():获取方差,可选择根据像素间距进行调整

示例代码

#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方法在每个轴上设置相同的值,或者如果需要沿每个轴使用不同的值,则可以使用 SetSigmaArray
  • Set/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滤波器而言,更加灵活,可以得到更多种类的平滑结果。

这篇关于【ITK库学习】使用itk库进行图像滤波ImageFilter:模糊降噪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/486011

相关文章

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

Python logging模块使用示例详解

《Pythonlogging模块使用示例详解》Python的logging模块是一个灵活且强大的日志记录工具,广泛应用于应用程序的调试、运行监控和问题排查,下面给大家介绍Pythonlogging模... 目录一、为什么使用 logging 模块?二、核心组件三、日志级别四、基本使用步骤五、快速配置(bas

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Python文件操作与IO流的使用方式

《Python文件操作与IO流的使用方式》:本文主要介绍Python文件操作与IO流的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python文件操作基础1. 打开文件2. 关闭文件二、文件读写操作1.www.chinasem.cn 读取文件2. 写

PyQt6中QMainWindow组件的使用详解

《PyQt6中QMainWindow组件的使用详解》QMainWindow是PyQt6中用于构建桌面应用程序的基础组件,本文主要介绍了PyQt6中QMainWindow组件的使用,具有一定的参考价值,... 目录1. QMainWindow 组php件概述2. 使用 QMainWindow3. QMainW

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据