【ITK库学习】使用itk库进行图像分割(二):区域生长--连接ConnectedImageFilter

1、itkNeighborhoodConnectedImageFilter 领域链接

该类的功能是标记连接到种子并位于邻域内的像素。

NeighborhoodConnectedImageFilter使用ReplaceValue标记连接到初始种子且其邻域位于上下阈值范围内的像素。
该滤波器是ConnectedThresholdImageFilter的一个相关变量,该类仅仅接受哪些所有相邻像素亮度在区间范围的数据,每个像素数据邻域大小是用户提供的整数范围来定义的。

常用的成员函数

  • AddSeed():增加种子点
  • ClearSeeds():清除种子列表
  • SetSeed():设置种子点
  • Set/GetRadius() :设置/获取用于遮罩的邻域的半径
  • Set/GetLower():设置/获取下限阈值
  • Set/GetUpper():设置/获取上限阈值
  • Set/GetReplaceValue():设置/获取值以替换阈值像素, 介于Lower和Upper(含)内的像素将被替换为该值, 默认值为 1

示例代码:

#include "itkImage.h"
#include "itkNeighborhoodConnectedImageFilter.h"

using namespace itk;

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

bool neighborhoodConnectedImage(ShortImageType* image, ShortImageType* outImage)
{
	const short lowerThr = 0;      //设置二值化的上下阈值
	const short upperThr = 1000;
	const short replaceValue = 255;

	ShortImageType::SizeType radius;
	radius[0] = 5;    
	radius[1] = 5;

	ShortImageType::IndexType seed;
	seed[0] = 100; //该值必须在图像的三维大小范围内
	seed[1] = 100;

	typedef NeighborhoodConnectedImageFilter<ShortImageType, ShortImageType> NeiConnectedFilterType;
	typename NeiConnectedFilterType::Pointer thresholder = NeiConnectedFilterType::New();
	thresholder->SetInput(image);
	thresholder->SetLower(lowerThr);
	thresholder->SetUpper(upperThr);
	thresholder->SetRadius(radius);
	thresholder->SetSeed(seed);
	thresholder->SetReplaceValue(replaceValue);
	try
	{
		thresholder->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}

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

2、itkConfidenceConnectedImageFilter 置信连接

该类使用连通性对具有相似统计数据的像素进行分段,它的使用标准是基于当前区域的统计上的。

该滤波器提取一组连接的像素,其像素强度与种子点的像素统计数据一致。
首先, 计算种子点邻域(8 个连通、26 个连通等)的均值方差;然后,对连接到该种子点且其值在该种子点的置信区间内的像素进行分组,置信区间的宽度由**“乘数Multiplier”**变量控制(置信区间是平均值加上或减去“乘数”乘以标准差) ; 如果区域内的强度变化呈高斯分布,则“乘数”设置为 2.5, 将定义足够宽的置信区间,以捕获该区域中 99% 的样本。

计算出初始分割后,将重新计算均值和方差,先前分割中的所有像素都用于计算均值方差(而不是使用种子点附近的像素), 然后使用这些像素值的均值和方差的精确估计来重新计算分割

该过程将重复指定的迭代次数,将“NumberOfIterations”设置为零会在从种子点进行初始分割后停止算法。

注意:下限和上限阈值仅限于输入数据像素类型的有效数值限制内。 此外,可以调整限制以包含种子点的强度。

常用的成员函数

  • AddSeed():增加种子点
  • ClearSeeds():清除种子列表
  • SetSeed():设置种子点
  • GetSeeds():获取所有种子点
  • Set/GetReplaceValue():设置/获取值以替换阈值像素
  • Set/GetNumberOfIterations():设置/获取迭代次数
  • Set/GetMultiplier():设置/获取乘数来定义置信区间,乘数可以是大于零的任何值,典型值为 2.5
  • Set/GetInitialNeighborhoodRadius():设置初始邻域半径
  • GetMean():获取输出区域中像素平均值, 仅应在使用Update()方法执行过滤器后调用此方法
  • GetVariance():获取输出区域中像素方差,仅应在使用 Update() 方法执行过滤器后调用此方

示例代码:

#include "itkImage.h"
#include "itkConfidenceConnectedImageFilter.h"

using namespace itk;

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

bool confidenceConnectedImage(ShortImageType* image, ShortImageType* outImage)
{
	const short replaceValue = 255;

	ShortImageType::IndexType seed;
	seed[0] = 100; //该值必须在图像的三维大小范围内
	seed[1] = 100;
	
    typedef ConfidenceConnectedImageFilter<ShortImageType, ShortImageType> ConfConnectedFilterType;
	typename ConfConnectedFilterType::Pointer thresholder = ConfConnectedFilterType::New();
	thresholder->SetInput(image);
	thresholder->SetMultiplier(2.5);     //设置乘数来定义置信区间
	thresholder->SetNumberOfIterations(5);     //迭代次数
	thresholder->SetInitialNeighborhoodRadius(2);   //设置初始邻域半径
	thresholder->SetSeed(seed);
	thresholder->SetReplaceValue(replaceValue);
	try
	{
		thresholder->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}
	double mean = thresholder->GetMean();
	double variance = thresholder->GetVariance();
	
	outImage = thresholder->GetOutput();
	return true;
}


3、itkVectorConfidenceConnectedImageFilter 向量图像的置信连接

该类使用连通性对具有相似统计数据的像素进行分段。

该滤波器提取一组连通的像素,其像素强度与种子点的像素统计数据一致。计算种子点的邻域(8个连通、26个连通等)的均值和方差; 然后对连接到该种子点且其值在该种子点的置信区间内的像素进行分组。置信区间的宽度由“乘数”变量控制(置信区间是平均值加上或减去“乘数”乘以标准差)。如果片段上的强度变化呈高斯分布,则“乘数”设置为2.5将定义足够宽的置信区间,以捕获该片段中 99% 的样本。

计算出初始分割后,将重新计算均值和方差,先前分割中的所有像素都用于计算平均值和方差(而不是使用种子点附近的像素),然后使用这些像素值的均值和方差的精确估计来重新计算分割。该过程将重复指定的迭代次数。将“NumberOfIterations”设置为零会在从种子点进行初始分割后停止算法。

注意:下限和上限阈值仅限于输入数据像素类型的有效数值限制内。此外,可以调整限制以包含种子点的强度。

常用的成员函数

  • AddSeed():增加种子点
  • ClearSeeds():清除种子列表
  • SetSeed():设置种子点
  • GetSeeds():获取所有种子点
  • Set/GetReplaceValue():设置/获取值以替换阈值像素
  • Set/GetNumberOfIterations():设置/获取迭代次数
  • Set/GetMultiplier():设置/获取乘数来定义置信区间,乘数可以是大于零的任何值,典型值为 2.5
  • Set/GetInitialNeighborhoodRadius():设置初始邻域半径
  • GetMean():获取输出区域中像素平均值, 仅应在使用Update()方法执行过滤器后调用此方法
  • GetCovariance():获取分割期间计算的协方差矩阵

示例代码:(有BUG,尚未解决)

#include "itkImage.h"
#include "itkVectorConfidenceConnectedImageFilter.h"

using namespace itk;

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

bool vectorConfidenceConnectedImage(ShortImageType* image, ShortImageType* outImage)
{
	const short replaceValue = 255;

	ShortImageType::IndexType seed;
	seed[0] = 100; //该值必须在图像的三维大小范围内
	seed[1] = 100;

	typedef VectorConfidenceConnectedImageFilter< ShortImageType, ShortImageType> VecConfConnectedFilterType;
	typename VecConfConnectedFilterType::Pointer thresholder = VecConfConnectedFilterType::New();
	thresholder->SetInput(image);
	thresholder->SetMultiplier(2.5);     //设置乘数来定义置信区间
	thresholder->SetNumberOfIterations(5);     //迭代次数
	thresholder->SetInitialNeighborhoodRadius(2);   //设置初始邻域半径
	thresholder->SetSeed(seed);
	thresholder->SetReplaceValue(replaceValue);
	try
	{
		thresholder->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}
	VecConfConnectedFilterType::MeanVectorType mean = thresholder->GetMean();
	VecConfConnectedFilterType::CovarianceMatrixType covariance = thresholder->GetCovariance();

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

报错信息:
‘itk::VectorConfidenceConnectedImageFilter<ImageType,ImageType>::InputImagePixelType’: 当后面跟“::”时必须为类或命名空间
InputImagePixelType”:“::”的左边必须是类/结构/联合
尚未找到好的解决方案!先记录下来

4、itkIsolatedConnectedImageFilter 孤立连接

该类的主要功能是标记连接到一组种子但不连接到另一组种子的像素。

该类会找到分离两个区域的最佳阈值。它有两种模式,一种是通过自动找到最小分离区域的上阈值来分离被亮区域包围的暗区域,另一种是通过自动找到最大分离区域的下阈值来分离被暗区域包围的亮区域。可以通过设置FindUpperThresholdOn()/Off()来选择模式。在这两种情况下,隔离阈值都是通过 GetIsolatedValue() 获得的。

该算法使用ReplaceValue标记连接到Seeds1且未连接到Seeds2的像素,当找到分离的被亮区域包围的两个暗区域的阈值时,给定下阈值,滤波器调整上阈值,直到两组种子不相连,该算法使用二进位搜索来调整上限阈值,从Upper开始。寻找分隔两个明亮区域的阈值则相反。
Lower 默认为输入图像的最小可能像素值,Upper默认为输入图像的最大可能像素值。

用户还可以提供下限值和上限值来限制分割,但是,如果范围过于严格,则可能会出现在用户指定的下限值和上限值之间找不到隔离阈值的情况。因此,除非用户确定要设置的界限,否则建议用户将这些值分别设置为图像中的最低和最高像素值。

用户可以为要分离的两个区域指定多个种子点,该算法将尝试找到阈值,以确保所有第一个种子点都包含在生成的分割中,并且所有第二个种子点不包含在分割中。

该算法可能无法找到隔离阈值,因为不存在这样的阈值。 用户可以通过查询GetThresholdingFailed() 标志来检查这一点。

常用的成员函数

  • AddSeed1():添加种子点1,该种子点将与Seed2分离(如果可能),连接到该种子的所有像素都将被替换为ReplaceValue
  • AddSeed2():添加种子点2,该种子点将与Seed1隔离(如果可能)
  • SetSeed1/2():该功能先清空种子点后增加:this->ClearSeeds1/2(); this->AddSeed1/2(seed);
  • ClearSeeds1/2():清除所有种子点1/种子点2
  • GetSeeds1/2():获取所有种子点1/2
  • Set/GetLower():设置/获取下限阈值
  • Set/GetUpper():设置/获取上限阈值
  • Set/GetReplaceValue():设置/获取替换的阈值的像素值,位于阈值内的像素将替换为该值,默认值为 1
  • Set/GetFindUpperThreshold():设置/获取是否找到上限阈值(分隔两个黑暗区域)或下限阈值(分隔两个明亮区域)
  • FindUpperThresholdOn():设置/获取是否找到上限阈值(分隔两个黑暗区域)或下限阈值(分隔两个明亮区域)
  • GetIsolatedValue():获取隔离两个种子的像素值
  • Set/GetIsolatedValueTolerance():设置/获取强度阈值所需的精度(容差),默认值为 1
  • GetThresholdingFailed():获取指示算法是否未能找到阈值的标志

示例代码:

#include "itkImage.h"
#include "itkIsolatedConnectedImageFilter.h"

using namespace itk;

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

bool isolatedConnectedImage(ShortImageType* image, ShortImageType* outImage)
{
	const short lowerThr = 0;      //设置二值化的上下阈值
	const short upperThr = 1000;
	const short replaceValue = 255;

	ShortImageType::IndexType seed1;
	seed1[0] = 100; //该值必须在图像的三维大小范围内
	seed1[1] = 100;
	
	ShortImageType::IndexType seed2;
	seed2[0] = 10; //该值必须在图像的三维大小范围内
	seed2[1] = 10;
	
    typedef IsolatedConnectedImageFilter<ShortImageType, ShortImageType> IsoConnectedFilterType;
	typename IsoConnectedFilterType::Pointer thresholder = IsoConnectedFilterType::New();
	thresholder->SetInput(image);
	thresholder->SetLower(lowerThr);
	thresholder->AddSeed1(seed1);    
	thresholder->AddSeed2(seed1);
	thresholder->SetReplaceValue(replaceValue);
	try
	{
		thresholder->Update();
	}
	catch (itk::ExceptionObject& ex)
	{
		//读取过程发生错误
		std::cerr << "Error: " << ex << std::endl;
		return false;
	}
	shortPixelType isolatedValue = thresholder->GetIsolatedValue();

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

归纳(来自GTP):

itkConnectedThresholdImageFilter:通过选择图像中的一个种子像素和一个上下阈值,该算法将与种子像素相连且像素值在阈值范围内的像素进行区域生长,也可以选择种子像素和图像中的像素值作为种子像素的标准差范围来进行区域生长。

itkNeighborhoodConnectedImageFilter:在定义种子像素的基础上,该算法通过比较每个像素和邻域像素的差异来决定像素是否加入到区域中,可以使用阈值来控制差异范围。

itkConfidenceConnectedImageFilter:基于统计学方法,该算法通过使用像素值的均值和方差来衡量像素与种子像素之间的相似度,通过调整置信水平参数来控制区域的大小。

itkVectorConfidenceConnectedImageFilter:是itkConfidenceConnectedImageFilter的扩展,用于多通道图像的分割,通过在每个通道上分别计算置信水平来进行区域连接。

itkIsolatedConnectedImageFilter:对于每个连接的像素,该算法会计算它与已经连接区域的连接度,并将其添加到区域中,直到连接度达到某个阈值。

  • 44
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值