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

发布时间:2023年12月18日

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 : EndCodeSnippet

    typedef 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 Number

	ShortImageType::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适用于需要按照给定的起始点和大小裁剪图像的场景,例如将图像的一部分移动到另一个位置;根据具体的应用场景,可以选择合适的滤波器来提取所需的图像。

文章来源:https://blog.csdn.net/weixin_41804847/article/details/135064155
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。