第一次写博客,写的不好,多多见谅
区域生长-ConnectedThresholdImageFilter
此代码在ITK目录下Examples/Segmentation/ConnectedThresholdImageFilter.cxx 中
下面的例子阐述了itk::ConnectedThresholdImageFilter的用法。这个滤波器使用了注水迭代器。区域生长方法最主要的算法复杂性是访问相邻像素。
注水迭代器承担起这个作用,大大简化了区域生长算法的执行。剩下的算法就是确定一个是否应该将一个特殊的像素包含到当前的区域的标准中。
ConnectedThresholdImageFilter使用的标准是基于用户提供的一个亮度值间距,需要提供上下限的值。
I(X)∈【lower,upper】
现在我们来分析一下这个算法需要的最简单的代码,首先,必须包含含有ConnectedThresholdImageFilter类的头文件
#include "itk::ConnectedThresholdImageFilter.h"
图像中存在的噪声将大大降低滤波器生长大面积区域的能力。当面对噪声图像时,通常是使用一个边缘保留平滑滤波器。在这里我们使用的是
#include "itkCurvatureFlowImageFilter.h"
我们基于一个特殊的像素类型和维来定义图像类型。由于平滑滤波器的需要,在这里我们使用浮点型数据定义像素:
typedef float InternalPixelType;
const unsigned int Dimension=2;
typedef itk::Image<InternalPixelType,Dimension> InternalImageType
使用图像类型作为模板参数来对平滑滤波器进行实例化:
typedef itk::CurvatureFlowImageFilter<InternalImageType,InternalImageType> CurvatureFlowImageFilterType;
然后调用New()方式来创建滤波器并将指向itk::SmartPointer:
CurvatureFlowImageFilterType::Pointer smoothing=CurvatureFlowImageFilterType::New();
现在我们声明区域生长滤波器的类型,本例中使用ConnectedThresholdImageFilter:
typedef itk::ConnectedThresholdImageFilter<InternalImageType,InternalImageType> ConnectedFilterType;
然后我们使用New()方式构造这种类的一个滤波器
ConnectedFilterType::Pointer connectedThreshold=ConnectedFilterType::New();
现在连接到一个简单的线性管道,在管道的开头添加一个reader文件头,并在末尾加一个cast filter和writer。由于只有一小部分图像文件格式支持
浮点型数据类型,所以使cast filter将浮点型数据类型转换成整型。
smoothing->SetInput(reader->GetOutput());
connectedThreshold->SetInput(smoothing->GetOutput());
caster->SetInput(connectedThreshold->GetOutput());
writer->SetInput(caster->GetOutput());
CurvatureFlowImageFilter需要定义两个参数。下面是一个二维图像的常见值。当然他们需要根据输入图像存在的噪声的数量进行调整。
smoothing->SetNumberOfIterations(5);
smoothing->SetTimeStep(0.125);
ConnectedThresholdImageFilter有两个主要的参数需要定义,他们分别是为了确定是否含在区域中的亮度值而制定的标准的上限和下限。这两个值设定的太接近就会降低区域生长的机动性,而设定的太远必将整个图像都卷入区域中。
connectedThreshold->SetLower(lowerThreshold);
connectedThreshold->SetUpper(upperThreshold);
这个滤波器的输出是一个二值图像,这个二值图像出了分割出的区域外到处都是零值像素。区域中的亮度值是由SetReplaceValue()方式来选择的:
connectedThreshold->SetReplaceValue(255);
这个算法的实例化需要用户提供一个种子点。种子点是以一种itk::Index的形式传递给SetSeed()方式的
connectedThreshold->SetSeed(index);
writer上的Updata()方法引发了管道的运行