【ITK库学习】使用itk库进行图像滤波ImageFilter:亮度的线性映射

1、itkCastImageFilter

该类的主要功能是将输入像素转换为输出像素类型。

该过滤器根据输入图像类型和输出图像类型进行模板化,它是对输入图像进行pixel-wise,并不对像素的亮度值做处理。

即将图像 itk::Image<type1, dim> 投射到:itk::Image<type2, dim>
也可以将:itk::VectorImage<type1, dim> 投射到:itk::VectorImage<type2, dim>

注:如果需要执行降维,可能需要使用ExtractImageFilter而不是CastImageFilter。

示例代码

#include "itkImage.h"
#include "itkCastImageFilter.h"

const unsigned int  Dimension = 3;       //数据的Dimension

typedef signed short shortPixelType;
typedef itk::Image<shortPixelType, Dimension> ShortImageType;
typedef float floatPixelType;
typedef itk::Image<floatPixelType, Dimension> FloatImageType;

bool castImage(FloatImageType* image, ShortImageType* outImage)
{
	typedef itk::CastImageFilter<FloatImageType, ShortImageType> castFilter;
	typename castFilter::Pointer cast = castFilter::New();
	cast->SetInput(image);
	try
	{
		cast->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}

	outImage = cast->GetOutput();
	return true;
}

2、itkRescaleIntensityImageFilter

该类的主要功能是对输入图像的强度级别进行线性变换。

它对输入图像像素的强度值应用逐像素线性变换,线性变换由用户根据输出图像应具有的最小值和最大值来定义,会将图像的动态范围强制转换为合适于图像显示常见的一个特定范围。

强度值的映射方程:
在这里插入图片描述

在将计算值分配给输出像素之前,所有计算均以输入像素的RealType精度进行。

它是一个简单的像素值重映射滤波器,可以将像素值的范围从一个区间重映射到另一个区间。它的主要用途是调整图像的对比度和亮度。它的使用方法是使用SetOutputMinimum()和SetOutputMaximum()方法设置输出的最小和最大值,然后将输入图像作为输入参数传递给RescaleIntensityImageFilter的Update()方法,即可得到重映射后的输出图像。

注意:在此过滤器中,输入图像的最小值和最大值是使用MinimumMaximumImageCalculator在内部计算的,用户不应在此过滤器中设置这些值;如果需要一个可以设置最小值最大值的过滤器,请使用IntensityWindowingImageFilter;如果想要一个可以使用用户定义的强度线性变换的过滤器,请使用ShiftScaleImageFilter

常用的成员函数

  • SetImage():设置输入图像
  • Set/GetOutputMaximum/Minimum():设置/获取输出图像的最大值/最小值
  • GetInputMaximum/Minimum():获取输入图像的最大值/最小值
  • GetScale():获取用于灰度值线性变换的缩放,仅在过滤器Update后才有效
  • GetShift():获取用于灰度值线性变换的偏移,仅在过滤器Update后才有效

示例代码

#include "itkImage.h"
#include "itkRescaleIntensityImageFilter.h"

const unsigned int  Dimension = 3;       //数据的Dimension

typedef double doublePixelType;
typedef itk::Image<doublePixelType, Dimension> DoubleImageType;
typedef unsigned char charPixelType;
typedef itk::Image<charPixelType, Dimension> CharImageType;

bool rescaleIntensityImage(DoubleImageType* image, CharImageType* outImage)
{
	typedef itk::RescaleIntensityImageFilter<DoubleImageType, CharImageType> rescaleIntensityFilter;
	typename rescaleIntensityFilter::Pointer rescaleFilter = rescaleIntensityFilter::New();
	rescaleFilter->SetInput(image);
	//rescaleFilter->SetOutputMaximum(1000);    //根据需求自行判断是否设置及具体参数值
	//rescaleFilter->SetOutputMinimum(100);
	try
	{
		rescaleFilter->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}
	double maxInput= rescaleFilter->GetInputMaximum();
	double minInput = rescaleFilter->GetInputMinimum();
	double maxOutput = rescaleFilter->GetOutputMaximum();
	double minOutput = rescaleFilter->GetInputMinimum();
	double scale = rescaleFilter->GetScale();
	double shift = rescaleFilter->GetShift();

	outImage = rescaleFilter->GetOutput();
	return true;
}

3、itkIntensityWindowingImageFilter

该类是对用户定义区间内的输入图像的强度级别应用线性变换。超出此区间的值将映射为常量,区间内的值被映射到另一个常量。

它是一个更高级的像素值窗位窗宽调整滤波器,可以根据指定的窗位窗宽参数,将图像的像素值映射到一个指定范围。它的主要用途是调整医学图像的窗位窗宽以显示感兴趣的区域。它的使用方法是使用SetWindowMinimum()和SetWindowMaximum()方法设置窗位和窗宽的范围,然后将输入图像作为输入参数传递给IntensityWindowingImageFilter的Update()方法,即可得到窗位窗宽调整后的输出图像。

所以,itkRescaleIntensityImageFilter更适用于简单的像素值范围重映射,而itkIntensityWindowingImageFilter更适用于医学图像的窗位窗宽调整。

常用的成员函数

  • SetImage():设置输入图像
  • Set/GetOutputMaximum/Minimum():设置/获取输出图像的最大值/最小值
  • Set/GetWindowMaximum/Minimum():设置/获取输入强度窗口的最大/最小强度值
  • SetWindowLevel():设置/获取窗宽和窗位,这是使用SetWindowMinimum()/ SetWindowMaximum() 的替代API,窗口最小值和最大值设置为[level-window/2, level+window/2]
  • GetScale():获取用于灰度值线性变换的缩放,仅在过滤器Update后才有效
  • GetShift():获取用于灰度值线性变换的偏移,仅在过滤器Update后才有效

示例代码

#include "itkImage.h"
#include "itkIntensityWindowingImageFilter.h"

const unsigned int  Dimension = 3;       //数据的Dimension

typedef double doublePixelType;
typedef itk::Image<doublePixelType, Dimension> DoubleImageType;
typedef unsigned char charPixelType;
typedef itk::Image<charPixelType, Dimension> CharImageType;

bool intensityWindowingImage(CharImageType* image, DoubleImageType* outImage)
{
	typedef itk::IntensityWindowingImageFilter<CharImageType, DoubleImageType> IntensityFilterType;
	typename IntensityFilterType::Pointer intensityWindowingFilter = IntensityFilterType::New();
	intensityWindowingFilter->SetInput(image);
	intensityWindowingFilter->SetWindowMinimum(100);
	intensityWindowingFilter->SetWindowMaximum(1000);
	intensityWindowingFilter->SetOutputMinimum(0.0);
	intensityWindowingFilter->SetOutputMaximum(255.0); // double but in the range of chars.
	try
	{
		intensityWindowingFilter->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}

	outImage = intensityWindowingFilter->GetOutput();
	return true;
}

4、itkShiftScaleImageFilter

该类同样应用一个输入图像亮度的线性变换,移动和缩放图像中的像素。

它将输入像素偏移Shift(默认 0.0),然后按Scale(默认 1.0)缩放像素,所有计算均以输入像素的 RealType精度进行。在将计算值分配给输出像素之前,该值被钳制在像素类型的NonpositiveMin和 max处。

映射方程为:
在这里插入图片描述
常用的成员函数

  • SetImage():设置输入图像
  • Set/GetScale():设置/获取缩放像素的比例因子,比例在移位之后应用
  • Set/GetShift():设置/获取像素的偏移量,转变之后是一个尺度
  • GetUnderflowCount/OverflowCount():获取下溢和上溢的像素数

示例代码

#include "itkImage.h"
#include "itkShiftScaleImageFilter.h"

const unsigned int  Dimension = 3;       //数据的Dimension
typedef signed short shortPixelType;
typedef itk::Image<shortPixelType, Dimension> ShortImageType;

bool shiftScaleImage(ShortImageType* image, ShortImageType* outImage)
{
    typedef	itk::ShiftScaleImageFilter<ShortImageType, ShortImageType> ShiftScaleFilterType;
	typename ShiftScaleFilterType::Pointer shiftScaleFilter = ShiftScaleFilterType::New();
	shiftScaleFilter->SetInput(image);
	shiftScaleFilter->SetScale(1.2);    //设置缩放的比例因子
	shiftScaleFilter->SetShift(300);    //设置偏移量
	try
	{
		shiftScaleFilter->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}
	int underflowCount = shiftScaleFilter->GetUnderflowCount();
	int overflowCount = shiftScaleFilter->GetOverflowCount();

	outImage = shiftScaleFilter->GetOutput();
	return true;
}

5、itkNormalizeImageFilter

该类的主要功能是通过将图像的均值设置为0并将方差设置为1来标准化图像。

该类会移动和缩放图像,以便图像中的像素具有0均值和单位方差。此过滤器使用StatisticsImageFilter来计算输入的均值和方差,然后应用ShiftScaleImageFilter来移动和缩放像素。

itkNormalizeImageFilter用于将像素值归一化到指定的范围,可以根据给定的最小值和最大值来进行归一化操作,使得图像的像素值在指定范围内分布。

注意:由于该过滤器对数据进行归一化,使得平均值为0,并且-σ到+σ映射到-1.0到1.0,因此输出图像积分类型将生成一个不具有单位方差的图像,因为68%强度值映射到-1.0到1.0的实数范围,然后转换为输出积分值。

映射方程为:
在这里插入图片描述
示例代码

#include "itkImage.h"
#include "itkNormalizeImageFilter.h"

const unsigned int  Dimension = 3;       //数据的Dimension

typedef double doublePixelType;
typedef itk::Image<doublePixelType, Dimension> DoubleImageType;
typedef unsigned char charPixelType;
typedef itk::Image<charPixelType, Dimension> CharImageType;

bool ITKThresholdFilterCode::normalizeImage(CharImageType* image, DoubleImageType* outImage)
{
    typedef itk::NormalizeImageFilter<CharImageType, DoubleImageType> NormalizeFilterType;
	typename NormalizeFilterType::Pointer normalizeFilter = NormalizeFilterType::New();
	normalizeFilter->SetInput(image);
	try
	{
		normalizeFilter->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}

	outImage = normalizeFilter->GetOutput();
	return true;
}

6、itkNormalizeToConstantImageFilter

该类是使缩放图像像素强度以使所有像素的总和等于用户定义的常数。

它是itkNormalizeImageFilter的一个子类,它只将图像归一化到一个特定的常数值,不设置最小值和最大值。它会将图像中所有的像素值都除以一个常数,使得最终的像素值都等于这个常数值(默认为1)。这个常数值可以通过**SetConstant()**方法设置。

这种变换对于标准化卷积核特别有用。

常用的成员函数

  • SetImage():设置输入图像
  • Set/GetConstant():设置/获取归一化常数

示例代码

#include "itkImage.h"
#include "itkNormalizeToConstantImageFilter.h"

const unsigned int  Dimension = 3;       //数据的Dimension
typedef float floatPixelType;
typedef itk::Image<floatPixelType, Dimension> FloatImageType;

bool normalizeToConstantImage(FloatImageType* image, FloatImageType* outImage)
{
	typedef itk::NormalizeToConstantImageFilter<FloatImageType, FloatImageType> NormalizeToConstantImageFilterType;
	typename NormalizeToConstantImageFilterType::Pointer normalizeToConstantFilter =
		NormalizeToConstantImageFilterType::New();
	normalizeToConstantFilter->SetInput(image);
	normalizeToConstantFilter->SetConstant(1);
	try
	{
		normalizeToConstantFilter->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}
	
	outImage = normalizeToConstantFilter->GetOutput();
	return true;
}

  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ITK(Insight Segmentation and Registration Toolkit)是一个开源的图像处理,提供了丰富的图像过滤和分析功能。其中之一的多线程图像过滤功能,是对图像进行并行处理的重要特性。 使用多线程过滤图像可以显著提高图像处理的效率。多线程技术可以将图像划分成多个区域,每个线程负责处理一个区域,同时进行处理。比如,对一幅图像进行平滑操作时,可以将图像分割成多个块,每个线程对其中一个块进行平滑处理,最后再将结果合并。 多线程过滤图像的步骤如下: 1. 导入ITK,并创建图像对象。 2. 设置多线程过滤器的参数,比如平滑半径、滤波类型等。 3. 创建多线程过滤器对象,并将图像对象作为输入。 4. 调用多线程过滤器的Update()函数进行处理。 5. 获取处理后的结果,可以保存为新的图像文件或进行后续分析。 多线程过滤图像的好处是可以充分利用计算机的多核处理器,提高处理速度,特别是对大规模的图像数据而言。同时,多线程过滤图像可以减少对内存的占用,提高了程序的稳定性。 然而,使用多线程过滤图像也有一些需要注意的地方。首先,需要合理调节线程数量,避免过多的线程导致资源竞争或者过多的开销。其次,需要注意线程之间的同步问题,以避免出现数据冲突等错误。最后,不同的图像过滤器可能对多线程支持的程度有所不同,需要进行相应的测试和优化。 总之,ITK提供了强大的多线程图像过滤功能,可以提高图像处理的效率和准确性。使用多线程过滤图像需要合理设置参数并处理同步问题,以充分发挥多核处理器的优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值