1 #include "itkImage.h"
2 #include "itkThresholdSegmentationLevelSetImageFilter.h"
3
4 #include "itkFastMarchingImageFilter.h"
5 #include "itkBinaryThresholdImageFilter.h"
6 #include "itkImageFileReader.h"
7 #include "itkImageFileWriter.h"
8 #include "itkZeroCrossingImageFilter.h"
9
10
11 int main( int argc, char *argv[] )
12 */
25 /*现在我们使用一个特殊的像素类型和维来定义图像类型。在这种情况下我们将使用二维
26 浮点型图像*/
27 typedef float InternalPixelType;
28 const unsigned int Dimension = 3;
29 typedef itk::Image< InternalPixelType, Dimension > InternalImageType;
30 //接下来的几行使用New()方式实例化一个ThresholdSegmentationLevelSetImageFilter:
31 typedef unsigned char OutputPixelType;
32 typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
33 typedef itk::BinaryThresholdImageFilter<InternalImageType, OutputImageType>
34 ThresholdingFilterType;
35
36 ThresholdingFilterType::Pointer thresholder = ThresholdingFilterType::New();
37
38 thresholder>SetLowerThreshold( 1000.0 );
39 thresholder>SetUpperThreshold( 0.0 );
40
41 thresholder>SetOutsideValue( 0 );
42 thresholder>SetInsideValue( 255 );
43
44 typedef itk::ImageFileReader< InternalImageType > ReaderType;
45 typedef itk::ImageFileWriter< OutputImageType > WriterType;
46
47 ReaderType::Pointer reader = ReaderType::New();
48 WriterType::Pointer writer = WriterType::New();
49 //输入图像
50 reader>SetFileName( "BrainProtonDensity3Slices.mha" );
51 //保存图像
52 writer>SetFileName( "naoshi_Threshold_LevelSet.mha" );
53
54 typedef itk::FastMarchingImageFilter< InternalImageType, InternalImageType >
55 FastMarchingFilterType;
56
57 FastMarchingFilterType::Pointer fastMarching = FastMarchingFilterType::New();
58
59 typedef itk::ThresholdSegmentationLevelSetImageFilter< InternalImageType,
60 InternalImageType > ThresholdSegmentationLevelSetImageFilterType;
61 ThresholdSegmentationLevelSetImageFilterType::Pointer thresholdSegmentation =
62 ThresholdSegmentationLevelSetImageFilterType::New();
/*对于ThresholdSegmentationLevelSetImageFilter,缩放比例参数用来平衡从等式(9 3)
64 中的传播(膨胀)和曲率(表面平滑)系数的影响。这个滤波器中不使用水平对流系数。使用
65 SetPropagationScaling()和SetCurvatureScaling()方式来设置这些系数。在这个例子中这两个
66 系数都设置为1.0*/
67 thresholdSegmentation>SetPropagationScaling( 1.0 );
68 /*if ( argc > 8 )
69
72 else
73 */
76
77 thresholdSegmentation>SetMaximumRMSError( 0.02 );
78 thresholdSegmentation>SetNumberOfIterations( 1200 );//设置最大迭代次数
79 /* 收敛标准MaximumRMSError和MaximumIterations设置的和前面例子中的一样。现在我
80 们设置上下门限U和L,以及在初始化模型时使用的等值面值*/
81 //上门限值(U)
82 thresholdSegmentation>SetUpperThreshold( ::atof("250") );
83 //下门限值(L)
84 thresholdSegmentation>SetLowerThreshold( ::atof("210") );
85 thresholdSegmentation>SetIsoSurfaceValue(0.0);
86
87 thresholdSegmentation>SetInput( fastMarching>GetOutput() );
88 thresholdSegmentation>SetFeatureImage( reader>GetOutput() );
89 thresholder>SetInput( thresholdSegmentation>GetOutput() );
90 writer>SetInput( thresholder>GetOutput() );
91
92 typedef FastMarchingFilterType::NodeContainer NodeContainer;
93 typedef FastMarchingFilterType::NodeType NodeType;
94
95 NodeContainer::Pointer seeds = NodeContainer::New();
96
97 InternalImageType::IndexType seedPosition;
98 //设置种子点位置
99 seedPosition[0] = atoi("84");
100 seedPosition[1] = atoi("126");
101 seedPosition[2] = atoi("2");
102 //表面到种子点的最初距离
103 const double initialDistance = atof("5");//5
104
105 NodeType node;
106
107 const double seedValue = initialDistance;
108
109 node.SetValue( seedValue );
110 node.SetIndex( seedPosition );
111
112 seeds>Initialize();
113 seeds>InsertElement( 0, node );
114
115 fastMarching>SetTrialPoints( seeds );
116
117 fastMarching>SetSpeedConstant( 1.0 );
118 /*调用writer上的Updata()方法引发了管道的运行。通常在出现错误和抛出异议时,从一
119 个try / catch模块调用updata:*/
120 try
121
130 catch( itk::ExceptionObject & excep )
131
136
137 std::cout << std::endl;
138 std::cout << "Max. no. iterations: " << thresholdSegmentation>GetNumberOfIterations() << std::endl;
139 std::cout << "Max. RMS error: " << thresholdSegmentation>GetMaximumRMSError() << std::endl;
140 std::cout << std::endl;
141 std::cout << "No. elpased iterations: " << thresholdSegmentation>GetElapsedIterations() << std::endl;
142 std::cout << "RMS change: " << thresholdSegmentation>GetRMSChange() << std::endl;
143
144 typedef itk::ImageFileWriter< InternalImageType > InternalWriterType;
145 //fastMarching快速步进输出水平集
146 InternalWriterType::Pointer mapWriter = InternalWriterType::New();
147 mapWriter>SetInput( fastMarching>GetOutput() );
148 mapWriter>SetFileName("fastMarchingImage.mha");
149 mapWriter>Update();
150 //阈值水平集分割的速度(传播系数P)图像
151 InternalWriterType::Pointer speedWriter = InternalWriterType::New();
152 speedWriter>SetInput( thresholdSegmentation>GetSpeedImage() );
153 speedWriter>SetFileName("speedTermImage.mha");
154 speedWriter>Update();
155
156 return EXIT_SUCCESS;
157 }
上一篇:OpenCV3.3深度神经网络DNN模块 实例1:读取单张PNG文件(opencv3.3环境测试)
下一篇:OpenCV3.2图像分割 实例10:绿幕视频背景替换
ITK









