【ITK库学习】使用itk库进行图像滤波ImageFilter:提取区域/切片/裁剪

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

目录

  • 1、itkRegionOfInterestImageFilter 提取区域
  • 2、itkExtractImageFilter 提取切片
  • 3、itkCropImageFilter 裁剪图像区域

1、itkRegionOfInterestImageFilter 提取区域

该类可以从输入图像中提取感兴趣的区域。

该滤波器产生与输入图像具有相同尺寸的输出图像。

如果想更改图像的尺寸,可以考虑使用ExtractImageFilter,例如,用于从3D图像的切片中提取2D图像。

常用的成员函数

  • Set/GetRegionOfInterest():设置/获取要提取的区域

示例代码

#include "itkImage.h"
#include "itkRegionOfInterestImageFilter.h"typedef itk::Image<short, 3> ShortImageType;bool regionOfInterestImageFilter(ShortImageType* image, ShortImageType* outImage)
{ShortImageType::IndexType start;start.Fill(50);ShortImageType::SizeType size;size.Fill(25);ShortImageType::RegionType desiredRegion;desiredRegion.SetSize(size);desiredRegion.SetIndex(start);// Software Guide : EndCodeSnippettypedef itk::RegionOfInterestImageFilter<ShortImageType, ShortImageType> RegionOfInterestFilterType;typename RegionOfInterestFilterType::Pointer regionInterestFilter = RegionOfInterestFilterType::New();regionInterestFilter->SetInput(image);regionInterestFilter->SetRegionOfInterest(desiredRegion);try{regionInterestFilter->Update();}catch (itk::ExceptionObject& ex){//读取过程发生错误std::cerr << "Error: " << ex << std::endl;return false;}outImage = regionInterestFilter->GetOutput();return true;
}

2、itkExtractImageFilter 提取切片

该滤波器通过将图像裁剪到选定的区域边界来减小图像大小。

它通过移除目标区域之外的像素来更改图像的图像边界,必须指定目标区域。

该滤波器还折叠维度,使得输入图像可以具有比输出图像更多的维度(即,从nD输入图像到n-1D输出图像)。若要指定要折叠的尺寸,必须指定ExtractionRegion,对于ExtractionRegion,Size[dim]=0,则该维度被折叠,要折叠的索引由ExtractionRegion指定,索引[dim],例如,我们有一个图像4D=4x4x4x4图像,并且我们想要从4D(即4D的第三个“时间”切片)获得一个3D图像,3D=4x4x4的图像,指定为[x,y,z,2],提取区域的size=[4,4,4,0]和Index=[0,0,0,2]。

ExtractionRegion中的维度数,size和index必须=InputImageDimension,ExtractionRegion中非零维度的数目,必须size=OutputImageDimension。

此滤波器生成的输出图像将与输入图像具有相同的原点,而输出图像的ImageRegion将从ExtractRegion参数中提供的起始索引值开始。

从更大维度的输入空间折叠的输出图像的方向通常是一个定义不清的问题,要求应用程序开发人员为折叠方向余弦选择所需的转换策略。需要明确请求策略(即没有工作默认值)。

此滤波器实现为多线程筛选器,它为其实现提供了一个DynamicThreadGenerateData() 方法。

此筛选器源自InPlaceImageFilter,当该过滤器的输入与输出请求区域匹配时,就像流式过滤器用于输入一样,将该过滤器设置为就地运行将不会复制大容量像素数据。

常用的成员函数

  • Set/GetExtractionRegion():设置/获取输出图像区域,如果Size=0即折叠该 dimension,这意味着输出图像的c维度将小于输入图像,其中c = number of 提取Size = 0

示例代码

#include "itkImage.h"
#include "itkExtractImageFilter.h"typedef itk::Image<short, 3> ShortImageType;bool extractImageFilter(ShortImageType* image, ShortImageType* outImage)
{//GetBufferedRegion:获取区域对象,该对象定义当前加载在内存中的图像区域的大小和起始索引ShortImageType::RegionType inputRegion = image->GetBufferedRegion();ShortImageType::SizeType size = inputRegion.GetSize();size[2] = 0;ShortImageType::IndexType start = inputRegion.GetIndex();start[2] = 10;   //slice NumberShortImageType::RegionType desiredRegion;desiredRegion.SetSize(size);desiredRegion.SetIndex(start);typedef itk::ExtractImageFilter<ShortImageType, ShortImageType> ExtractFilterType;typename ExtractFilterType::Pointer extractFilter = ExtractFilterType::New();extractFilter->SetInput(image);extractFilter->SetDirectionCollapseToSubmatrix();extractFilter->SetExtractionRegion(desiredRegion);extractFilter->SetNumberOfThreads(8);    //设置多线程try{extractFilter->Update();}catch (itk::ExceptionObject& ex){//读取过程发生错误std::cerr << "Error: " << ex << std::endl;return false;}outImage = extractFilter->GetOutput();return true;
}

3、itkCropImageFilter 裁剪图像区域

该滤波器通过在最大可能区域的上限和下限按itk::size裁剪图像来减小图像大小。

它通过移除目标区域之外的像素来更改图像的图像边界,目标区域不是预先指定的,而是在BeforeThreadGenerateData()中计算的。

此过滤器使用ExtractImageFilter执行裁剪。

常用的成员函数

  • Set/GetUpperBoundaryCropSize():设置/获取上边界的裁剪尺寸
  • Set/GetLowerBoundaryCropSize():设置/获取下边界的裁剪尺寸
  • SetBoundaryCropSize():设置/获取边界的裁剪尺寸

示例代码

#include "itkImage.h"
#include "itkCropImageFilter.h"typedef itk::Image<short, 3> ShortImageType;bool cropImageFilter(ShortImageType* image, ShortImageType* outImage)
{//GetBufferedRegion:获取区域对象,该对象定义当前加载在内存中的图像区域的大小和起始索引ShortImageType::SizeType cropSize;cropSize[0] = 100;cropSize[1] = 100;cropSize[2] = 50;ShortImageType::SizeType upperCrop;upperCrop[0] = 200;upperCrop[1] = 200;upperCrop[2] = 100;ShortImageType::SizeType lowerCrop;lowerCrop[0] = 100;lowerCrop[1] = 100;lowerCrop[2] = 50;typedef itk::CropImageFilter<ShortImageType, ShortImageType> CropFilterType;typename CropFilterType::Pointer cropFilter = CropFilterType::New();cropFilter->SetInput(image);cropFilter->SetBoundaryCropSize(cropSize);//cropFilter->SetUpperBoundaryCropSize(upperCrop);//cropFilter->SetLowerBoundaryCropSize(lowerCrop);cropFilter->SetNumberOfThreads(8);    //设置多线程try{cropFilter->Update();}catch (itk::ExceptionObject& ex){//读取过程发生错误std::cerr << "Error: " << ex << std::endl;return false;}outImage = cropFilter->GetOutput();return true;}

itkRegionOfInterestImageFilter通过指定一个t特定区域来提取感兴趣的区域,该滤波器接受一个输入图像和一个Region区域,在输出图像中将只保留该Region区域内的像素,该滤波器通常用于向下采样或裁剪图像。

itkExtractImageFilter通过指定一个区域起始点和多个起始点以及一个步进值来提取多个子图像,该滤波器接受一个输入图像,并通过设置Index、Size、Direction和SetNumberOfThreads方法来设置子图像的起始点、大小、方向和线程数,该滤波器通常用于分割图像、提取感兴趣的图像区域以及对图像进行配准等。

itkCropImageFilter用于从一个输入图像中裁剪出一个子图像,它接受一个输入图像、一个起始点和一个大小作为输入参数,并输出裁剪后的子图像。起始点表示裁剪后子图像的左上角像素的坐标,大小表示子图像的尺寸。它与itkExtractImageFilter的不同是使用起始点和大小来指定子图像的位置和尺寸,而itkExtractImageFilter使用索引范围来指定子图像在输入图像中的范围。

综上所述,itkRegionOfInterestImageFilter适用于提取一个感兴趣的矩形区域,而itkExtractImageFilter适用于提取多个子图像,itkCropImageFilter适用于需要按照给定的起始点和大小裁剪图像的场景,例如将图像的一部分移动到另一个位置;根据具体的应用场景,可以选择合适的滤波器来提取所需的图像。

这篇关于【ITK库学习】使用itk库进行图像滤波ImageFilter:提取区域/切片/裁剪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他