【ITK库学习】使用itk库进行图像滤波ImageFilter:频域滤波

目录

  • 1、itkFFTConvolutionImageFilter 快速傅里叶变换计算
  • 2、扩展:itkConvolutionImageFilter.h
  • 3、itkFFTShiftImageFilter 频率转移滤波器
  • 4、itkFFTNormalizedCorrelationImageFilter FFT实现的归一化相关滤波器

1、itkFFTConvolutionImageFilter 快速傅里叶变换计算

该类使用傅里叶域中的乘法将给定图像与任意图像内核进行卷积。

该过滤器产生的输出相当于 ConvolutionImageFilter 的输出,当核较大时,它利用卷积定理来加速卷积计算。由于FFT的特性,它可以大大加速卷积计算,尤其是对于卷积核较大的情况。但是对于某些特殊的卷积核,如具有特定形状或非对称性的核,可能会导致较大的计算误差。

警告
该过滤器忽略内核图像的间距、原点和方向,并将它们视为与输入图像中的相同。

常用的成员函数

  • SetKernelImage():设置卷积内核

示例代码

#include "itkImage.h"
#include "itkFFTConvolutionImageFilter.h"typedef itk::Image<float, 3> FloatImageType;bool FFTConvolutionImageFilter(FloatImageType* image, FloatImageType* outputImage)
{typename FloatImageType::Pointer kernelImage = FloatImageType::New();unsigned int width = 10;createKernel(kernelImage, width);typedef itk::FFTConvolutionImageFilter<FloatImageType, FloatImageType> FFTConvolutionFilterType;typename FFTConvolutionFilterType::Pointer fftFilter = FFTConvolutionFilterType::New();fftFilter->SetInput(image);fftFilter->SetKernelImage(kernelImage);try{fftFilter->Update();}catch (itk::ExceptionObject& ex){//读取过程发生错误std::cerr << "Error: " << ex << std::endl;return false;}outputImage = fftFilter->GetOutput();return true;
}void CreateKernel(FloatImageType::Pointer kernel, unsigned int width)
{FloatImageType::IndexType start;start.Fill(0);FloatImageType::SizeType size;size.Fill(width);FloatImageType::RegionType region;region.SetSize(size);region.SetIndex(start);kernel->SetRegions(region);kernel->Allocate();itk::ImageRegionIterator<FloatImageType> imageIterator(kernel, region);while (!imageIterator.IsAtEnd()){// imageIterator.Set(255);imageIterator.Set(1);++imageIterator;}
}

2、扩展:itkConvolutionImageFilter.h

该类将给定图像与任意图像内核进行卷积。

该滤波器的工作原理是将翻转后的内核集中在图像中的每个像素处,并计算图像中的像素值与内核中的像素值之间的内积。

内核的中心定义为[(2*i+s−1)/2],其中 i 是索引,s 是内核图像的最大可能区域的大小。

对于所有维度上具有奇数大小的内核,这对应于中心像素,如果核图像的某个维度具有偶数大小,则该维度中核的中心索引将是小于图像中心的连续索引的最大积分索引。

可以选择使用 NormalizeOn() 将内核标准化为总和为 1,默认情况下标准化处于关闭状态。

警告
该过滤器忽略内核图像的间距、原点和方向,并将它们视为与输入图像中的相同。

其常用的成员函数与代码结构与FFTConvolutionImageFilter类似,参见1中内容

3、itkFFTShiftImageFilter 频率转移滤波器

将傅里叶变换的零频率分量移至图像的中心。

傅立叶变换生成的图像中,零频率分量位于图像的角落,使其难以理解,该滤波器将组件移动到图像的中心。

注意:对于奇数尺寸的图像,如果不对两个过滤器中的一个(且仅一个)使用 SetInverse(true),则应用此过滤器两次将不会生成与原始图像相同的图像。

常用的成员函数

  • Set/GetInverse():设置/获取过滤器是否必须反转变换,这个选项对于输入图像的尺寸都是偶数的情况没有影响,但是如果至少有一个维度的尺寸是奇数,则需要使用这个选项来恢复原始图像,简而言之,这个选项的作用是针对尺寸为奇数的输入图像进行处理,使其尺寸与原始图像保持一致
  • InverseOn/Off():同上

示例代码

#include "itkImage.h"
#include "itkFFTShiftImageFilter.h"typedef itk::Image<float, 3> FloatImageType;bool FFTShiftImageFilter(FloatImageType* image, FloatImageType* outputImage)
{typedef itk::FFTShiftImageFilter<FloatImageType, FloatImageType> FFTShiftFilterType;typename FFTShiftFilterType::Pointer fftFilter = FFTShiftFilterType::New();fftFilter->SetInput(image);try{fftFilter->Update();}catch (itk::ExceptionObject& ex){//读取过程发生错误std::cerr << "Error: " << ex << std::endl;return false;}outputImage = fftFilter->GetOutput();return true;
}

4、itkFFTNormalizedCorrelationImageFilter FFT实现的归一化相关滤波器

使用 FFT 计算归一化互相关。

该滤波器使用 FFT 而不是空间相关来计算两个图像的归一化互相关 (NCC),对于相当大的结构元素,它比空间关联要快得多,该过滤器是更通用的 MaskedFFTNormalizedCorrelationImageFilter 的子类,其操作原理是将该算法中的掩码设置为图像,正如下面的参考文献中详细描述的,利用更通用的掩模算法没有计算消耗,因为计算仍然需要对图像进行 FFT。

输入:需要两个图像作为输入,fixedImage 和 movingImage,在相关性的背景下,输入通常被定义为:“图像”和“模板”,该过滤器能够关联任意两个图像,并且不限于小型移动图像(模板)。

可选参数:RequiredNumberOfOverlappingPixels 使用户能够指定两个图像的多少体素必须重叠; 相关图中由少于此数量的体素产生的任何位置将被设置为零,较大的值会将相关图像周围较大边界上的像素清零,因此,较大的值消除了不太稳定的计算,但也限制了捕获范围,如果“RequiredNumberOfOverlappingPixels”设置为 0(默认值),则不会进行归零。

图像大小:fixedImage 和 movingImage 不必具有相同的大小。 此外,虽然一些算法要求“模板”小于“图像”,因为两者不完全重叠的区域中存在误差,但该过滤器没有这样的限制。

图像间距:由于计算是在像素域中完成的,因此所有输入图像必须具有相同的间距。

输出: 输出是 RealPixelType 的图像,即两幅图像的 NCC,其值范围为 -1.0 到 1.0。 根据定义,该 NCC 图像的大小为 size(fixedImage) + size(movingImage) - 1。

常用的成员函数

  • Set/GetInverse():设置/获取过滤器是否必须反转变换,这个选项对于输入图像的尺寸都是偶数的情况没有影响,但是如果至少有一个维度的尺寸是奇数,则需要使用这个选项来恢复原始图像,简而言之,这个选项的作用是针对尺寸为奇数的输入图像进行处理,使其尺寸与原始图像保持一致
  • InverseOn/Off():同上

示例代码

#include "itkImage.h"
#include "itkFFTNormalizedCorrelationImageFilter.h"typedef itk::Image<float, 3> FloatImageType;bool FFTNormalizedCorrelationImageFilter(FloatImageType* image, FloatImageType* outputImage)
{itk::Index<3> offset;offset[0] = 5;offset[1] = 6;offset[2] = 6;typename FloatImageType::Pointer fixedImage = FloatImageType::New();itk::Index<3> cornerOfFixedSquare;cornerOfFixedSquare[0] = 3;cornerOfFixedSquare[1] = 8;cornerOfFixedSquare[2] = 6;createImage(fixedImage, cornerOfFixedSquare);typename FloatImageType::Pointer movingImage = FloatImageType::New();itk::Index<3> cornerOfMovingSquare;cornerOfMovingSquare[0] = cornerOfFixedSquare[0] + offset[0];cornerOfMovingSquare[1] = cornerOfFixedSquare[1] + offset[1];cornerOfMovingSquare[2] = cornerOfFixedSquare[2] + offset[2];createImage(movingImage, cornerOfMovingSquare);typedef itk::FFTNormalizedCorrelationImageFilter<FloatImageType, FloatImageType> FFTNormalizedCorrelationFilterType;typename FFTNormalizedCorrelationFilterType::Pointer fftFilter = FFTNormalizedCorrelationFilterType::New();fftFilter->SetFixedImage(fixedImage);fftFilter->SetMovingImage(movingImage);try{fftFilter->Update();}catch (itk::ExceptionObject& ex){//读取过程发生错误std::cerr << "Error: " << ex << std::endl;return false;}outputImage = fftFilter->GetOutput();return true;
}void createImage(FloatImageType::Pointer image, const itk::Index<3>& cornerOfSquare)
{FloatImageType::IndexType start;start.Fill(0);FloatImageType::SizeType size;size.Fill(51);FloatImageType::RegionType region(start, size);image->SetRegions(region);image->Allocate();image->FillBuffer(0);itk::ImageRegionIterator<FloatImageType> imageIterator(image, region);FloatImageType::IndexValueType squareSize = 8;while (!imageIterator.IsAtEnd()){if (imageIterator.GetIndex()[0] > cornerOfSquare[0] &&imageIterator.GetIndex()[0] < cornerOfSquare[0] + squareSize &&imageIterator.GetIndex()[1] > cornerOfSquare[1] && imageIterator.GetIndex()[1] < cornerOfSquare[1] + squareSize){imageIterator.Set(255);}++imageIterator;}
}

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

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

相关文章

java.lang.IllegalArgumentException: Could not resolve placeholder XXX‘ in value

问题描述 使用Springcloudalibaba的nacos作为配置中心&#xff0c;服务启动时报错&#xff1a; java.lang.IllegalArgumentException: Could not resolve placeholder XXX‘ in value java.lang.IllegalArgumentException: Param ‘serviceName’ is illegal, serviceName is …

李超线段树维护斜率dp:P4655

https://www.luogu.com.cn/problem/P4655 这东西长得就很像斜率优化的东西&#xff0c;但是不能用朴素斜率优化&#xff0c;因为横坐标不满足递增。 但我们可以直接用李超线段树维护即可。 #include<bits/stdc.h> using namespace std; #ifdef LOCAL#define debug(...…

【动态规划精选题目】2、路径问题模型

此动态规划系列主要讲解大约10个系列【后续持续更新】 本篇讲解路径问题模型中的6道经典题&#xff0c;会在讲解题目同时给出AC代码 目录 1、不同路径 2、不同路径2 3、珠宝的最大价值 4、下降路径最小和 5、最小路径和 6、地下城游戏 1、不同路径 class Solution { publi…

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Pycharm 环境Android环境 相关其它博客工程源代码下载其它资料下载 前言 本项目采用VGG-16网络模型&#xff0c;使用Kaggle开源数据集&#xff0c;旨在提取图片中的用户特征&#xff0c;最终在移…

数据分析-14-基于Python的信用评分卡数据分析(包含代码数据)

文章目录 0. 数据代码下载1. 分析思路2. 理解数据3. 数据清洗3.1 选择子集3.2 列名重命名3.3 缺失数据处理3.4 异常值处理 4. 建立模型4.1 借款逾期超过90天的人数&#xff0c;即借款客户的整体质量情况&#xff1f;4.2 借款人月收入分布情况及月收入对违约客户数量的影响&…

低代码在制造业的应用前景

引言 数字化转型已经成为制造业的必然趋势&#xff0c;为了应对市场的快速变化、提高效率、降低成本&#xff0c;制造业企业不得不追求更智能、更敏捷的生产方式。在这一转型过程中&#xff0c;低代码技术崭露头角&#xff0c;成为了一种强大的工具&#xff0c;有望加速制造业…

PyCharm community 安装教程

目录 链接cudatoolkit 下载地址&#xff1a;https://www.jetbrains.com/pycharm/download/other.html 双击打开 安装路径&#xff0c;可自行更换到D盘 不导入设置 链接cudatoolkit

设计模式(2)--对象创建(5)--单件

1. 意图 保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 2. 一种角色 单件(Singleton) 3. 优点 3.1 对唯一实例的受控访问 3.2 缩小名空间(对全局变量的改进) 3.3 允许对操作和表示精化(可以有子类) 3.4 允许可变数目的实例 3.5 比类操作更灵活 4. 缺点…

轻松学会使用 SCP 命令在 Linux 中传输文件

前言 在 Linux 系统中&#xff0c;如果你想要轻松地将文件或目录从一个地方传输到另一个地方&#xff0c;scp 命令是你的好帮手。它让文件传输变得简单快捷&#xff0c;就像拷贝和粘贴一样容易。 什么是 SCP&#xff1f; SCP&#xff08;Secure Copy Protocol&#xff09;是…

RFC4861 中文版下

10. 协议常量 路由器常量: MAX_INITIAL_RTR_ADVERT_INTERVAL 16 秒MAX_INITIAL_RTR_ADVERTISEMENTS 3 次发送MAX_FINAL_RTR_ADVERTISEMENTS 3 次发送MIN_DELAY_BETWEEN_RAS 3 秒MAX_RA_DELAY_TIME .5 秒主机常量: MAX_RTR_SOLICITATION_…

python c++ summary pdb gdb frame registers 调试器,栈帧,寄存器的查看

pdb import pdbpdb.set_trace() # 设置追踪断点 命令说明p a打印aq退出n下一行s执行下一行&#xff08;能够进入函数体&#xff09;r执行下一行&#xff08;在函数中时会直接执行到函数返回处&#xff09;w打印堆栈信息unt N执行到第N行disasdisplay assembler code 打印所有…

c++程序设计编写一个程序,输入N个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分

编写一个程序&#xff0c;输入N个学生数据&#xff0c;包括学号、姓名、成绩&#xff0c;要求输出这些学生数据并计算平均分。要求&#xff1a; &#xff08;1&#xff09;设计一个学生类Stud&#xff0c;除了包括no(学号)、name(姓名)和deg(成绩)数据成员外&#xff0c;有两个…

【C语言】cache和程序访问的局部性对程序性能的影响

文章目录 1&#xff0e;源程序比较其性能影响2&#xff0e;内存分配&#xff08;1&#xff09;静态存储区&#xff08;static&#xff09;&#xff1a;&#xff08;2&#xff09;栈区&#xff08;stack&#xff09;&#xff1a;&#xff08;3&#xff09;堆区&#xff08;heap&…

msvcp140.dll丢失怎样修复?全面分析msvcp140.dll的修复方法

在执行特定程序时&#xff0c;有可能遭遇msvcp140.dll文件遗失的困扰&#xff0c;此时该如何处理呢&#xff1f;此次将为您讲述面临此类问题的有效解决方案&#xff0c;涉及到多种修复方法&#xff0c;其中包括利用DLL修复工具进行操作。您可依据个人需求选择相应的修复方式&am…

Linux:时间显示(函数介绍)

文章目录 1、sleep&#xff1a;延迟函数2、time/localtime3、示例&#xff1a;sleep time localtime4、Linux时间调整 1、sleep&#xff1a;延迟函数 函数原型&#xff1a;unsigned int sleep(unsigned int seconds); 功 能&#xff1a;延时 参 数&#xff1a;seconds:秒&am…

LeetCode100123执行操作使频率分数最大(相关话题:滑动窗口,二分法,前缀和)

题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你可以对数组执行 至多 k 次操作&#xff1a; 从数组中选择一个下标 i &#xff0c;将 nums[i] 增加 或者 减少 1 。最终数组的频率分数定义为数组中众数的 频率 。请你返回你可以得到的 最大 频率分数。 众数…

条款5:了解c++默默编写并调用了哪些函数

如果你不自己声明&#xff0c;编译器会替你声明&#xff08;编译器版本的&#xff09;拷贝构造函数、拷贝赋值运算符和析构函数。此外&#xff0c;如果你没有声明任何构造函数&#xff0c;编译器会为你声明一个默认构造函数。 class Empty{};本质上和写成下面这样是一样的: c…

力扣第13题-罗马数字转整数[简单]

题目描述 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例…

cpp_03_引用_类型转换_温和强转_面向对象

1 引用的应用 1.1 数据传递--值传递 C语言只要涉及数据传递&#xff08;例如&#xff1a;初始化、赋值、传参、返回值&#xff09;&#xff0c; 都为值传递&#xff08;将数据复制一份给到目标内存&#xff09;。 // value.cpp 值传递&#xff1a;将数据复制一份给别人 #in…

删除远端消息, 重进会话仍然取回已删除的消息

用户调用删除函数, 服务器不会判断 对应的 sentTime 是否存在, 仅仅是使用sentTime 直接进行消息删除, 然后返回操作成功; 用户删除远端消息时, 需要保证sentTime的合法性 - (void)deleteRemoteMessage:(RCConversationType)conversationType targetId:(NSString *)targetId me…