【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滤波器而言,更加灵活,可以得到更多种类的平滑结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/217040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果app应用ipa文件程序开发后如何运行到苹果iOS真机上测试?

在苹果应用程序开发过程中&#xff0c;将app安装于真机进行测试是一个不可或缺的步骤&#xff0c;它可以帮助你检测app在实际设备上的性能表现及存在的潜在问题。这篇文章将详细阐述如何将开发好的苹果app&#xff08;.ipa文件&#xff09;安装到真机上进行测试。 图片来源&…

文心一言 VS 讯飞星火 VS chatgpt (155)-- 算法导论12.3 2题

二、用go语言&#xff0c;假设通过反复向一棵树中插人互不相同的关键字来构造一棵二叉搜索树。证明&#xff1a;在这棵树中查找关键字所检查过的结点数目等于先前插入这个关键字所检查的结点数目加 1。 文心一言&#xff1a; 为了证明这个结论&#xff0c;我们可以使用二叉搜…

VisualSVN Server的安装全过程

目录 背景: 安装过程&#xff1a; 步骤1&#xff1a; 步骤2&#xff1a; 步骤3&#xff1a; 步骤4&#xff1a; 步骤5&#xff1a; 安装出现的bug&#xff1a; 问题: 解决办法: 总结: 背景: VisualSVN Server 是一款免费的 SVN (Subversion) 服务器软件&#xff0c…

2创建工程及点灯

1:软件安装&#xff1a; 1关注公众号“纸飞资”&#xff0c;键盘输入keil“”,按照文章要求安装编译软件 2芯片安装&#xff1a; 方式一&#xff1a;离线安装。去Keil公司官网的器件支持包下载页面选择对应的公司及器件型号&#xff0c;然后在Device Family Pack文本框中点击…

Python异常、模块和包

Python异常、模块和包 1.了解异常2.异常的捕获方法3.异常的传递4.Python模块5.Python包 1.了解异常 1.1什么是异常 当检测到一个错误是&#xff0c;Python解释器就无法继续执行了&#xff0c;发而出现了一些错误提示&#xff0c;这就是所谓的“异常”&#xff0c;也就是我们常…

二叉树的最大深度(力扣

int maxDepth(struct TreeNode* root) {if(!root) return 0;return fmax(maxDepth(root->left),maxDepth(root->right))1; }

【开源软件】最好的开源软件-2023-第26名 Accelerate

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

PHP的最新版本是多少?有什么新特性?

截至日期&#xff08;2022年1月&#xff09;&#xff0c;PHP的最新稳定版本是PHP 8.0。以下是PHP 8.0的一些主要新特性&#xff1a; JIT 编译器&#xff1a; 引入了即时编译&#xff08;Just-In-Time&#xff0c;JIT&#xff09;引擎&#xff0c;提升了PHP脚本的执行性能。 命…

可以操作Access的ORM工具,MS Access日期的坑

可以操作Access的ORM工具&#xff0c;MS Access日期的坑 MS Access日期可以查询返回&#xff1b; 但作为参数&#xff0c;不能过滤成功&#xff0c;则试了三种日期类型都不可以; MS Access日期作为入参&#xff0c;在驱动官网找相关资料&#xff0c;找不到实例&#xff1b; …

【精选】小白是如何挖漏洞的(技巧篇)

目录&#xff1a; 怎么找漏洞 找到后如何挖漏洞 关于通杀漏洞N day漏洞的挖掘 漏洞如何提交 每小结都有提供对应的案例&#xff0c;简直不要太nice&#xff01; 这个月的SRC活动也快开始了&#xff0c;看到群里的小伙伴在问如何找漏洞&#xff0c;SQL注入的漏洞咋找&#x…

理解并使用React的有状态组件和无状态组件

在React中&#xff0c;有状态组件和无状态组件是两种基本的组件类型&#xff0c;它们在特性和使用场景上有所不同。本文将深入探讨这两种组件类型的理解及使用场景。 一、有状态组件 特点&#xff1a; 类组件&#xff1a;React中的有状态组件通常是使用ES6的类语法来定义的。…

SQL注入基础宝典(原理+详解)[每天更新]

简介: 开局先叠甲:新手上路&#xff0c;内容多有纰漏&#xff0c;仅供学习和参考&#xff0c;欢迎在评论区留言&#xff0c;同步更新。 因为自己是自学&#xff0c;没有很系统的知识体系&#xff0c;大半个月来&#xff0c;刷了一些sql注入的题目&#xff0c;包括封神榜&#x…

慢SQL诊断

最近经常遇到技术开发跑来问我慢SQL优化相关工作&#xff0c;所以干脆出几篇SQL相关优化技术月报&#xff0c;我这里就以公司mysql一致的5.7版本来说明下。 在企业中慢SQL问题进场会遇到&#xff0c;尤其像我们这种ERP行业。 成熟的公司企业都会有晚上的慢SQL监控和预警机制。…

思福迪运维安全管理系统 test_qrcode_b RCE漏洞复现

0x01 产品简介 思福迪运维安全管理系统是思福迪开发的一款运维安全管理堡垒机。 0x02 漏洞概述 由于思福迪运维安全管理系统 test_qrcode_b路由存在命令执行漏洞&#xff0c;攻击者可通过该漏洞在服务器端任意执行代码&#xff0c;写入后门&#xff0c;获取服务器权限&#…

【Docker】vxlan的原理与实验

VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟可扩展局域网&#xff09;&#xff0c;是一种虚拟化隧道通信技术。它是一种Overlay&#xff08;覆盖网络&#xff09;技术&#xff0c;通过三层的网络来搭建虚拟的二层网络。 VXLAN介绍 VXLAN是在底层…

【智能家居】八、监控摄像采集、人脸识别比对进行开门功能点

一、使用 fswebcam 测试 USB 摄像头 二、根据demo来实现功能点 三、功能点编写编译运行实现 四、mjpg实现监控识别 五、V4L2 视频设备 Linux 内核模块的一部分 一、使用 fswebcam 测试 USB 摄像头 a. 安装 fswebcam orangepiorangepi:~$ sudo apt update orangepiorangepi:~…

SSL证书可以有效避免劫持和钓鱼攻击

SSL证书对抗劫持和钓鱼攻击起到重要作用。通过使用SSL证书&#xff0c;网站可以防止黑客篡改网站内容或欺骗用户&#xff0c;确保用户所看到的是真实的网站信息&#xff0c;而不是被篡改的内容或诱导性的信息。这有助于保护用户的隐私和安全&#xff0c;并建立用户对网站的信任…

LeetCode008之字符串转换整数 (相关话题:状态机)

题目描述 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入字符串并丢弃无用的前导空格检查下一个字符&#xff08;假设还…

一天搞定jmeter入门到入职全套教程之Jmeter分布式测试

随着并发量的增大&#xff0c;一台机器就不能满足需求了&#xff0c;所以我们采用分布式&#xff08;Master-Slaver&#xff09;的方案去执行高并发的测试 注意事项&#xff1a; Master机器一般我们不执测试&#xff0c;所以可以拿一台配置差些的机器&#xff0c;主要用来采集…

linux查看某个时间段的日志(sed -n)

有时候找出某个时间段的日志&#xff0c;如2023-12-09 20:11:00 到 2023-12-09 20:15:59 用grep不太方便直接过滤出来&#xff0c;能够使用sed根据时间去查 sed -n ‘/开始时间日期/,/结束时间日期/p’ 日志文件名称 如 sed -n /2023-12-09 20:11:00/,/2023-12-09 20:15:59/p…