ITK 实例5 领域连接算法对脑部PNG图像进行二维分割


1 #include "itkNeighborhoodConnectedImageFilter.h" 2 #include "itkImage.h" 3 #include "itkCastImageFilter.h" 4 //使用 itk::CurvatureFlowImageFilter 在保护边缘时平滑图像 5 #include "itkCurvatureFlowImageFilter.h" 6 #include "itkImageFileReader.h" 7 #include "itkImageFileWriter.h" 8 9 int main( int argc, char *argv[] ) 10 */ 21 22 /*现在我们使用一个特殊的像素类型和图像维来定义图像的类型。由于平滑滤波器的需 23 要,这种情况下对像素使用浮点型数据类型*/ 24 typedef float InternalPixelType; 25 const unsigned int Dimension = 2; 26 typedef itk::Image< InternalPixelType, Dimension > InternalImageType; 27 //使用图像类型作为一个模板参数来对平滑滤波器类型进行实例化 28 typedef unsigned char OutputPixelType; 29 typedef itk::Image< OutputPixelType, Dimension > OutputImageType; 30 31 typedef itk::CastImageFilter< InternalImageType, OutputImageType > 32 CastingFilterType; 33 CastingFilterType::Pointer caster = CastingFilterType::New(); 34 35 typedef itk::ImageFileReader< InternalImageType > ReaderType; 36 typedef itk::ImageFileWriter< OutputImageType > WriterType; 37 38 ReaderType::Pointer reader = ReaderType::New(); 39 WriterType::Pointer writer = WriterType::New(); 40 41 reader>SetFileName( "BrainProtonDensitySlice.png" ); 42 writer>SetFileName( "Neighborhood_huizhi2.png"); 43 44 typedef itk::CurvatureFlowImageFilter<InternalImageType, InternalImageType> 45 CurvatureFlowImageFilterType; 46 //调用 New( ) 方式来定义滤波器并将结果指向一个 itk::SmartPointer 47 CurvatureFlowImageFilterType::Pointer smoothing = 48 CurvatureFlowImageFilterType::New(); 49 //现在我们声明区域生长滤波器的类型。这种情况下是 NeighborhoodConnectedImageFilter 50 typedef itk::NeighborhoodConnectedImageFilter<InternalImageType, 51 InternalImageType > ConnectedFilterType; 52 //使用 New( ) 方式对这个类的一个文件进行结构化 53 ConnectedFilterType::Pointer neighborhoodConnected 54 = ConnectedFilterType::New(); 55 /*现在到了连接一个简单的线性管道的时候。在管道的开头添加一个 reader 文件并在末尾 56 添加一个 cast filter 和 writer 。由于只有仅仅一小部分图像文件格式支持浮点型数据类型, 57 所以使用 cast filter 将浮点型数据类型转换成整型*/ 58 smoothing>SetInput( reader>GetOutput() ); 59 neighborhoodConnected>SetInput( smoothing>GetOutput() ); 60 caster>SetInput( neighborhoodConnected>GetOutput() ); 61 writer>SetInput( caster>GetOutput() ); 62 //滤波 /*CurvatureFlowImageFilter 需要定义两个参数。下面是一个二维图像的常见值。当然它们 64 也需要根据输入图像存在的噪声的数量进行适当的调整*/ 65 smoothing>SetNumberOfIterations( 5 ); 66 smoothing>SetTimeStep( 0.125 ); 67 68 const InternalPixelType lowerThreshold = atof( "180" ); 69 const InternalPixelType upperThreshold = atof( "210" ); 70 /*NeighborhoodConnectedImageFilter 有两个主要的参数需要设定,它们分别是为了确定是 71 否包含在区域中的亮度值而制定的标准的上门限和下门限。这两个值设定得太接近势必会降 72 低区域生长的机动性,而设定得太远必将整个图像都卷入区域中*/ 73 neighborhoodConnected>SetLower( lowerThreshold ); 74 neighborhoodConnected>SetUpper( upperThreshold ); 75 /*这里我们增加定义邻域大小的一个至关重要的参数,用来决定一个像素是否在这个区域 76 中。邻域越大,这个滤波器在输入图像中滤掉噪声的稳定性就越强,但是计算需要的时间也 77 将更长。这里我们选择每个维上两个长度r(2r+1)的一个滤波器,这将产生一个 5×5 像素的邻域*/ 78 InternalImageType::SizeType radius; 79 80 radius[0] = 2; // two pixels along X 81 radius[1] = 2; // two pixels along Y 82 83 neighborhoodConnected>SetRadius( radius ); 84 /*由于在 ConnectedThresholdImageFilter 中,现在我们就必须提供在区域中能被输出像素所 85 接受的亮度值而且至少是一个种子点来定义最初的区域*/ 86 InternalImageType::IndexType index; 87 88 index[0] = atoi( "107" ); 89 index[1] = atoi( "69"); 90 91 neighborhoodConnected>SetSeed( index ); 92 neighborhoodConnected>SetReplaceValue( 255 ); 93 /*Writer 上的 Updata() 方法引发了管道的运行。通常在出现错误和抛出异议时, 从一个 94 try / catch 模块调用 updata*/ 95 try 96 99 catch( itk::ExceptionObject & excep ) 100 104 return EXIT_SUCCESS; 105 }



上一篇:ITK 实例14 快速步进算法对脑部PNG图像进行二维分割

下一篇:OpenCV3.2图像分割 实例7:基于分水岭图像分割


ITK
Copyright © 2002-2019 k262电脑网 www.k262.cn 皖ICP备2020016292号
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!QQ:251442993 热门搜索 网站地图