实例23 置信连接算法对脑部MHA文件进行三维分割
在这个例子中使用前面例子中的代码,并设置图像的维数为 3 。应用梯度各向异性扩散来平滑图像。这个滤波器使用两个迭代器、一个值为 0.05 的 time step 和一个值为 3 的conductance 值,然后使用置信连接方式对平滑后的图像进行分割。使用的五个种子点的坐标分别为( 118 , 85 , 92 )、( 63 , 87 , 94 )、( 63 , 157 , 90 )、( 111 , 188 , 90 )、( 111 , 50 , 88 )。置信连接滤波器使用的参数:邻域范围是 2 ; 迭代器数目为5;和 f 值 为2.5( 跟前面的例子中一样 ) 。然后使VolView 来显示结果。
#include "itkConfidenceConnectedImageFilter.h"
#include "itkCastImageFilter.h"
#include "itkCurvatureFlowImageFilter.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
int main( int argc, char *argv[] )
{
//if( argc < 3 )
// {
// std::cerr << "Missing Parameters " << std::endl;
// std::cerr << "Usage: " << argv[0];
// std::cerr << " inputImage outputImage " << std::endl;
// return EXIT_FAILURE;
// }
typedef float InternalPixelType;
const unsigned int Dimension = 3;
typedef itk::Image< InternalPixelType, Dimension > InternalImageType;
typedef unsigned char OutputPixelType;
typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
typedef itk::CastImageFilter< InternalImageType, OutputImageType >
CastingFilterType;
CastingFilterType::Pointer caster = CastingFilterType::New();
typedef itk::ImageFileReader< InternalImageType > ReaderType;
typedef itk::ImageFileWriter< OutputImageType > WriterType;
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
reader->SetFileName( "BrainProtonDensity3Slices.mha" );
writer->SetFileName( "BrainProtonDensity3Slices_3.mha" );
typedef itk::CurvatureFlowImageFilter< InternalImageType, InternalImageType >
CurvatureFlowImageFilterType;
CurvatureFlowImageFilterType::Pointer smoothing =
CurvatureFlowImageFilterType::New();
typedef itk::ConfidenceConnectedImageFilter<InternalImageType, InternalImageType>
ConnectedFilterType;
ConnectedFilterType::Pointer confidenceConnected = ConnectedFilterType::New();
smoothing->SetInput( reader->GetOutput() );
confidenceConnected->SetInput( smoothing->GetOutput() );
caster->SetInput( confidenceConnected->GetOutput() );
writer->SetInput( caster->GetOutput() );
smoothing->SetNumberOfIterations( 2 );//
smoothing->SetTimeStep(0.05);//每步迭代时间
confidenceConnected->SetMultiplier( 2.5 );//;设置乘法因子f 2.5 可调
confidenceConnected->SetNumberOfIterations( 5 );//设置迭代次数为5(迭代器数目)
confidenceConnected->SetInitialNeighborhoodRadius( 2 );//设置领域范围为2
confidenceConnected->SetReplaceValue( 255 );
//设置种子点1
InternalImageType::IndexType index1;
index1[0] = 63;//X 轴
index1[1] = 67;//Y 轴
index1[2] = 1;//Z 轴 (第几个切片)
confidenceConnected->AddSeed(index1);
/* InternalImageType::IndexType index1;
index1[0] = 118;
index1[1] = 133;
index1[2] = 92;
confidenceConnected->AddSeed( index1 );*/
try
{
writer->Update();
}
catch( itk::ExceptionObject & excep )
{
std::cerr << "Exception caught !" << std::endl;
std::cerr << excep << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
当选取一个种子点(63,67,1),f=2.5时,三维图像中包含的三张二维图像的白质分割效果如下:
当选取一个种子点(120,146,1),f=2.3时,三维图像中包含的三张二维图像的白质分割效果如下:
当选取两个种子点(63,67,1)、(120,146,1),f=2.2时,三维图像中包含的三张二维图像的白质分割效果:
注:index1[2] = 0;//表示Z 轴 (第几个切片)从0开始计算(0表示第一个切片)
ITK系列目录:
注:例程配套素材见系列目录