1 #include "itkVectorConfidenceConnectedImageFilter.h"
2 #include "itkImage.h"
3 #include "itkImageFileReader.h"
4 #include "itkImageFileWriter.h"
5 #include "itkRGBPixel.h"
6
7 int main( int argc, char *argv[] )
8 {
9 /*if( argc < 7 )
10 {
11 std::cerr << "Missing Parameters " << std::endl;
12 std::cerr << "Usage: " << argv[0]
13 << " inputImage outputImage"
14 << " seedX seedY"
15 << " multiplier iterations" << std::endl;
16 return EXIT_FAILURE;
17 }*/
18 /*现在我们使用一个像素类型和一个特殊的维来定义图像类型。由于需要使用平滑滤波
19 器,所以这种情况下对像素使用浮点型数据类型*/
20 const unsigned int Dimension = 2;
21 typedef unsigned char PixelComponentType;
22 typedef itk::RGBPixel< PixelComponentType > InputPixelType;
23 typedef itk::Image< InputPixelType, Dimension > InputImageType;
24
25 typedef unsigned char OutputPixelType;
26 typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
27
28 typedef itk::ImageFileReader< InputImageType > ReaderType;
29 typedef itk::ImageFileWriter< OutputImageType > WriterType;
30
31 ReaderType::Pointer reader = ReaderType::New();
32 WriterType::Pointer writer = WriterType::New();
33
34 reader->SetFileName( "VisibleWomanEyeSlice.png" );
35 writer->SetFileName( "VisibleWomanEyeSlice_Vitreo.png" );
36 /*声明区域生长滤波器的类型,本例中使用 itk::VectorConfidenceConnectedImageFilter*/
37 typedef itk::VectorConfidenceConnectedImageFilter< InputImageType,
38 OutputImageType > ConnectedFilterType;
39 /*然后我们使用 New() 方式对一个滤波器对象结构化*/
40 ConnectedFilterType::Pointer confidenceConnected
41 = ConnectedFilterType::New();
42 //然后我们创建一个简单的线性处理管
43 confidenceConnected->SetInput( reader->GetOutput() );
44 writer->SetInput( confidenceConnected->GetOutput() );
45 //乘法因数f
46 const double multiplier = atof("3");
47 //VectorConfidenceConnectedImageFilter 需要定义两个参数。第一个,定义亮度范围大小
48 //的因子 f 。乘法因子太小将限制当前区域中很多有相似亮度的像素;乘法因子太大将放松接
49 //受条件并将导致区域过度生长。值太大就会使得这些区域生长到邻近区域,而这些邻近区域
50 //实际上可能属于独立的解剖结构。
51 confidenceConnected->SetMultiplier( multiplier );
52 /*迭代器的数目是基于被分割的解剖学结构亮度的均匀性之上指定的。均匀性高的区域仅
53 需要一对迭代器。带有 ramp 效果的区域,如带有不同一领域的 MRI 图像,就需要更多的迭代
54 器。实际上,精心选择乘法因子似乎比迭代器的数目更加重要。然而,务必记住这个算法需
55 要集中于一个稳定的区域。在这个算法上使用过多的迭代器将很有可能是这个区域吞没整个
56 图像*/
57 //迭代器数目
58 const unsigned int iterations = atoi("1");
59
60 confidenceConnected->SetNumberOfIterations( iterations );
61 /*这个滤波器的输出是一个二值图像,这个二值图像除了分割出的区域外到处都是零值像
62 素。区域中的亮度值是由 SetReplaceValue() 方式来选择的*/
63 confidenceConnected->SetReplaceValue( 255 );
64
65 InputImageType::IndexType index;
66 /*这个算法的实例化需要用户提供一个种子点。将这个点选在被分割的解剖学结构的典型
67 区域是很便捷的。种子区域周围的一个小的邻域将用来计算包含在标准里的最初的平均值和
68 标准差。种子以一种 itk::Index 的形式传递给 SetSeed() 方式*/
69 //种子位置
70 index[0] = atoi("66");
71 index[1] = atoi("66");
72 confidenceConnected->SetSeed( index );
73 /*种子区域周围邻域最初的大小是使用 SetInitialNeighborhoodRadius() 方式来定义的。这
74 个邻域将定义成一个拥有 2r + 1 个像素的 N 维矩形区域,其中 r 是作为最初邻域范围的传递值*/
75 confidenceConnected->SetInitialNeighborhoodRadius( 3 );
76 /*writer 上的 Updata() 方法引发了管道的运行。通常在出现错误和抛出异议时, 从一个
77 try / catch 模块调用 updata*/
78 try
79 {
80 writer->Update();
81 }
82 catch( itk::ExceptionObject & excep )
83 {
84 std::cerr << "Exception caught !" << std::endl;
85 std::cerr << excep << std::endl;
86 }
87 /*使用 GetMean() 方式和 GetCoaraiance() 方式可以查看最后一个迭代器最终的均值向量和
88 协方差矩阵的值*/
89 typedef ConnectedFilterType::MeanVectorType MeanVectorType;
90 typedef ConnectedFilterType::CovarianceMatrixType CovarianceMatrixType;
91
92 const MeanVectorType & mean = confidenceConnected->GetMean();
93 const CovarianceMatrixType & covariance
94 = confidenceConnected->GetCovariance();
95
96 std::cout << "Mean vector = " << mean << std::endl;
97 std::cout << "Covariance matrix = " << covariance << std::endl;
98
99 return EXIT_SUCCESS;
100 }
ITK 实例12 置信连接对PNG向量图像进行二维分割
发布时间 2023-08-16 15:01:01作者: 一杯清酒邀明月