【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

相关文章

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

如何使用Nginx配置将80端口重定向到443端口

《如何使用Nginx配置将80端口重定向到443端口》这篇文章主要为大家详细介绍了如何将Nginx配置为将HTTP(80端口)请求重定向到HTTPS(443端口),文中的示例代码讲解详细,有需要的小伙... 目录1. 创建或编辑Nginx配置文件2. 配置HTTP重定向到HTTPS3. 配置HTTPS服务器

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析