该类是一个基类,用于根据前景和背景像素的邻域投票进行二值图像处理。子类包括itkVotingBinaryHoleFillingImageFilter和itkVotingBinaryIterativeHoleFillingImageFilter。
笔记
非前景或背景的像素将保持不变。
常用的成员函数:
Set/GetRadius()
:设置/获取用于计算中位数的邻域半径Set/GetForegroundValue()
:设置/获取与二进制输入图像上的前景(或对象)和背景关联的值Set/GetBackgroundValue()
:设置/获取与二进制输入图像上的前景(或对象)和背景关联的值Set/GetSurvivalThreshold()
:设置/获取生存阈值,当邻域 ON 的数量小于此生存阈值中定义的值时,ON 的像素将关闭Set/GetBirthThreshold()
:设置/获取出生阈值, 当邻域 ON 的数量大于此阈值中定义的值时,关闭的像素将打开。该类主要通过对每个像素的邻域前景像素数量进行比较,占大多数时将背景像素转换为前景像素,来填充孔和空腔。
此类是一个针对孔洞填充的特殊情况的子类,它首先进行一次基于投票的二值图像处理,然后基于结果的前景像素来填充孔洞。
常用的成员函数:
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;
}
该类是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可通过多次迭代来获得更好的结果。
该类是一个像素级别的标签融合滤波器,它根据其邻域中的像素标签来融合给定像素的标签。
该滤波器通过对每个像素进行投票来实现标签融合的操作,每个像素的邻域中的每个像素都向指定的标签进行投票,投票最多的标签将成为该像素的最终标签。如果最大投票数为不唯一,即有多个标签具有最大投票数,则将“未决定”标签分配给该输出像素。
默认情况下,用于未确定像素的标签是输入图像中使用的最大标签值加一。 由于具有 8 位像素值的图像可以使用所有 256 个可能的标签值,因此允许将 8 位(即字节)图像组合成 16 位(即短)输出图像。
与传统的多数投票方法不同,LabelVotingImageFilter使用了一种基于距离加权的投票策略,以减少噪声或多个标签的不一致性。
此类的输入图像的像素类型应当是可比较的,支持相应的运算符,输出图像的像素类型可以是任何整数标量类型。
常用的成员函数:
Set/GetRadius()
:设置/获取邻域的半径SetLabelForUndecidedPixels()
:设置在投票过程中未决定的像素的标签GetLabelForUndecidedPixels()
:获取在投票过程中未决定的像素的标签,Update过滤器后,此函数返回用于当前输出中未确定像素的实际标签值,请注意,当调用SetLabelForUndecidedPixels 时,该值将被覆盖,并且新值仅在下一次过滤器更新时生效。UnsetLabelForUndecidedPixels()
:取消未确定像素的标签值并打开自动选择注意:itkLabelVotingImageFilter类的模板参数需要为无符号整数类型的像素类型,不要弄错,否则会报错““初始化”: 无法从“itk::Concept::IsUnsignedInteger
”。
示例代码:
#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;
}