【ITK库学习】使用itk库进行图像滤波ImageFilter:Voting滤波器

目录

  • 1、itkVotingBinaryImageFilter
  • 2、itkVotingBinaryHoleFillingImageFilter 洞穴充填滤波器
  • 3、itkVotingBinaryIterativeHoleFillingImageFilter
  • 4、itkLabelVotingImageFilter

1、itkVotingBinaryImageFilter

该类是一个基类,用于根据前景和背景像素的邻域投票进行二值图像处理。子类包括itkVotingBinaryHoleFillingImageFilter和itkVotingBinaryIterativeHoleFillingImageFilter。

笔记
非前景或背景的像素将保持不变。

常用的成员函数

  • Set/GetRadius():设置/获取用于计算中位数的邻域半径
  • Set/GetForegroundValue():设置/获取与二进制输入图像上的前景(或对象)和背景关联的值
  • Set/GetBackgroundValue():设置/获取与二进制输入图像上的前景(或对象)和背景关联的值
  • Set/GetSurvivalThreshold():设置/获取生存阈值,当邻域 ON 的数量小于此生存阈值中定义的值时,ON 的像素将关闭
  • Set/GetBirthThreshold():设置/获取出生阈值, 当邻域 ON 的数量大于此阈值中定义的值时,关闭的像素将打开。

2、itkVotingBinaryHoleFillingImageFilter 洞穴充填滤波器

该类主要通过对每个像素的邻域前景像素数量进行比较,占大多数时将背景像素转换为前景像素,来填充孔和空腔。

此类是一个针对孔洞填充的特殊情况的子类,它首先进行一次基于投票的二值图像处理,然后基于结果的前景像素来填充孔洞。

常用的成员函数

  • Set/GetMajorityThreshold():设置/获取多数门槛,超过 50% 的像素数量将决定OFF像素是否变为 ON,例如,如果某个像素的邻域有124个像素(不包括其自身),则 50% 将是 62,如果您将多数阈值设置为 5,则意味着过滤器需要67个或更多邻域像素才能打开以便将当前关闭像素切换为打开,默认值为 1。
  • SetSurvivalThreshold():保护 SetBirthThreshold() 和 SetSurvivalThreshold() 方法,以便此过滤器的用户无法访问它们
  • SetBirthThreshold():保护 SetBirthThreshold() 和 SetSurvivalThreshold() 方法,以便此过滤器的用户无法访问它们
  • GetNumberOfPixelsChanged():返回执行过滤器时更改的像素数
  • Set/GetForegroundValue():设置/获取与二进制输入图像上的前景(或对象)和背景关联的值
  • Set/GetBackgroundValue():设置/获取与二进制输入图像上的前景(或对象)和背景关联的值
  • Set/GetRadius():设置/获取用于计算邻域半径

示例代码

#include "itkImage.h"
#include "itkVotingBinaryHoleFillingImageFilter.h"

typedef itk::Image<short, 3> ShortImageType;

bool votingBinaryHollFillingImageFilter(ShortImageType* image, ShortImageType* outputImage)
{
	ShortImageType::SizeType indexRadius;
	indexRadius[0] = 2; // radius along x
	indexRadius[1] = 2; // radius along y
	indexRadius[2] = 2; // radius along z

	typedef itk::VotingBinaryHoleFillingImageFilter<ShortImageType, ShortImageType> VBHollFillFilterType;
	typename VBHollFillFilterType::Pointer vBHoleFillFilter = VBHollFillFilterType::New();
	vBHoleFillFilter->SetInput(image);
	vBHoleFillFilter->SetRadius(indexRadius);     //设置邻域半径
	vBHoleFillFilter->SetForegroundValue(255);    //指定用来作为前景和背景的灰度
	vBHoleFillFilter->SetBackgroundValue(0);
	vBHoleFillFilter->SetMajorityThreshold(3);    //表示邻域中前景的数量至少应为(直径*直径-1)+MajorityThreshold值
	try
	{
		vBHoleFillFilter->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}

	outputImage = vBHoleFillFilter->GetOutput();
	return true;
}

3、itkVotingBinaryIterativeHoleFillingImageFilter

该类是itkVotingBinaryHoleFillingImageFilter的进一步扩展。它通过多次迭代的二值图像处理来填补漏洞和空洞。

在每次迭代中,它使用前一次迭代的结果作为输入,并产生一个新的结果,直到达到指定的迭代次数或结果像素不再改变为止。此过滤器基于单个图像类型进行模板化,输出图像类型必须与输入图像类型相同。

过滤器的目的是填充中等尺寸(半径数十像素)的孔。原则上,迭代次数与要填充的孔的大小有关。孔越大,必须使用此过滤器运行更多迭代才能填充整个孔。邻域的大小还与孔边界的曲率以及孔的大小有关。请注意,作为附带效果,该过滤器还可能填充结构外侧的空腔。

常用的成员函数

  • Set/GetRadius():设置/获取用于计算邻域半径
  • Set/GetMajorityThreshold():设置/获取多数门槛,超过 50% 的像素数量将决定OFF像素是否变为 ON,例如,如果某个像素的邻域有124个像素(不包括其自身),则 50% 将是 62,如果您将多数阈值设置为 5,则意味着过滤器需要67个或更多邻域像素才能打开以便将当前关闭像素切换为打开,默认值为 1。
  • Set/GetForegroundValue():设置/获取与二进制输入图像上的前景(或对象)和背景关联的值
  • Set/GetBackgroundValue():设置/获取与二进制输入图像上的前景(或对象)和背景关联的值
  • Set/GetMaximumNumberOfIterations():设置/获取最大迭代次数,只要在前一次迭代中至少有一个像素发生变化,或者直到达到最大迭代次数前,会一直迭代执行该滤波器
  • Set/GetCurrentNumberOfIterations():设置/获取在任何给定时间执行的迭代次数,这在执行结束时很有用,可以验证执行了多少次迭代
  • GetNumberOfPixelsChanged():返回执行过滤器时更改的像素数

示例代码

#include "itkImage.h"
#include "itkVotingBinaryIterativeHoleFillingImageFilter.h"

typedef itk::Image<short, 3> ShortImageType;

bool votingBinaryIterativeHollFillingImageFilter(ShortImageType* image,
	ShortImageType* outputImage, int numberOfIterations)
{
	ShortImageType::SizeType indexRadius;
	indexRadius[0] = 2; // radius along x
	indexRadius[1] = 2; // radius along y
	indexRadius[2] = 2; // radius along z

	typedef itk::VotingBinaryIterativeHoleFillingImageFilter<ShortImageType> VBIterativeHoleFillFilterType;
	typename VBIterativeHoleFillFilterType::Pointer vBIterHoleFillFilter = VBIterativeHoleFillFilterType::New();
	vBIterHoleFillFilter->SetInput(image);
	vBIterHoleFillFilter->SetRadius(indexRadius);
	vBIterHoleFillFilter->SetBackgroundValue(0);
	vBIterHoleFillFilter->SetForegroundValue(255);
	vBIterHoleFillFilter->SetMajorityThreshold(2);
	vBIterHoleFillFilter->SetMaximumNumberOfIterations(numberOfIterations);
	try
	{
		vBIterHoleFillFilter->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}

	outputImage = vBIterHoleFillFilter->GetOutput();
	return true;
}

这三个类都是基于投票的二值图像处理算法,其中itkVotingBinaryHoleFillingImageFilter和itkVotingBinaryIterativeHoleFillingImageFilter专门用于孔洞填充的应用。itkVotingBinaryHoleFillingImageFilter只进行一次处理,而itkVotingBinaryIterativeHoleFillingImageFilter可通过多次迭代来获得更好的结果。

4、itkLabelVotingImageFilter

该类是一个像素级别的标签融合滤波器,它根据其邻域中的像素标签来融合给定像素的标签。

该滤波器通过对每个像素进行投票来实现标签融合的操作,每个像素的邻域中的每个像素都向指定的标签进行投票,投票最多的标签将成为该像素的最终标签。如果最大投票数为不唯一,即有多个标签具有最大投票数,则将“未决定”标签分配给该输出像素。

默认情况下,用于未确定像素的标签是输入图像中使用的最大标签值加一。 由于具有 8 位像素值的图像可以使用所有 256 个可能的标签值,因此允许将 8 位(即字节)图像组合成 16 位(即短)输出图像。

与传统的多数投票方法不同,LabelVotingImageFilter使用了一种基于距离加权的投票策略,以减少噪声或多个标签的不一致性。

此类的输入图像的像素类型应当是可比较的,支持相应的运算符,输出图像的像素类型可以是任何整数标量类型。

常用的成员函数

  • Set/GetRadius():设置/获取邻域的半径
  • SetLabelForUndecidedPixels():设置在投票过程中未决定的像素的标签
  • GetLabelForUndecidedPixels():获取在投票过程中未决定的像素的标签,Update过滤器后,此函数返回用于当前输出中未确定像素的实际标签值,请注意,当调用SetLabelForUndecidedPixels 时,该值将被覆盖,并且新值仅在下一次过滤器更新时生效。
  • UnsetLabelForUndecidedPixels():取消未确定像素的标签值并打开自动选择

注意itkLabelVotingImageFilter类的模板参数需要为无符号整数类型的像素类型,不要弄错,否则会报错““初始化”: 无法从“itk::Concept::IsUnsignedInteger::Constraints::TrueT”转换为“itk::Concept::Detail::UniqueType_bool”。

示例代码

#include "itkImage.h"
#include "itkLabelVotingImageFilter.h"

typedef itk::Image<unsigned short, 3> UnsignShortImageType;

bool labelVotingImageFilter(UnsignShortImageType* image, UnsignShortImageType* outputImage, unsigned short forUndecidedPixels)
{
    typedef itk::LabelVotingImageFilter<UnsignShortImageType, UnsignShortImageType> LabelVotingFilterType;
	typename LabelVotingFilterType::Pointer labelVotingFilter = LabelVotingFilterType::New();
	labelVotingFilter->SetInput(image);
	labelVotingFilter->SetLabelForUndecidedPixels(forUndecidedPixels);
	try
	{
		labelVotingFilter->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}

	outputImage = labelVotingFilter->GetOutput();
	return true;

}

你可能感兴趣的:(ITK,学习,图像处理,c++,算法)