【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

相关文章

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa