File: ImageRandomConstIteratorWithIndex.cxx

package info (click to toggle)
insighttoolkit5 5.4.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 704,588 kB
  • sloc: cpp: 784,579; ansic: 628,724; xml: 44,704; fortran: 34,250; python: 22,934; sh: 4,078; pascal: 2,636; lisp: 2,158; makefile: 461; yacc: 328; asm: 205; perl: 203; lex: 146; tcl: 132; javascript: 98; csh: 81
file content (154 lines) | stat: -rw-r--r-- 5,586 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*=========================================================================
 *
 *  Copyright NumFOCUS
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *         https://www.apache.org/licenses/LICENSE-2.0.txt
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *=========================================================================*/

// Software Guide : BeginLatex
//
// \doxygen{ImageRandomConstIteratorWithIndex} was developed to randomly
// sample pixel values.  When incremented or decremented, it jumps to a random
// location in its image region.
//
// \index{itk::Image\-Random\-Const\-Iterator\-With\-Index!sample size}
// \index{itk::Image\-Random\-Const\-Iterator\-With\-Index!begin and end
// positions}
//
// The user must specify a sample size when creating this iterator. The sample
// size, rather than a specific image index, defines the end position for the
// iterator.  \code{IsAtEnd()} returns
// \code{true} when the current sample number equals the sample size.
// \code{IsAtBegin()} returns \code{true} when the current sample number
// equals zero.  An important difference from other image iterators is that
// ImageRandomConstIteratorWithIndex may visit the same pixel
//  more than once.
//
// \index{itk::Image\-Random\-Const\-Iterator\-With\-Index!example of using|(}
// \index{itk::Image\-Random\-Const\-Iterator\-With\-Index!and statistics}
// Let's use the random iterator to estimate some simple image statistics. The
// next example calculates an estimate of the arithmetic mean of pixel values.
//
// First, include the appropriate header and declare pixel and image types.
//
// Software Guide : EndLatex

#include "itkImage.h"
// Software Guide : BeginCodeSnippet
#include "itkImageRandomConstIteratorWithIndex.h"
// Software Guide : EndCodeSnippet
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"

int
main(int argc, char * argv[])
{
  // Verify the number of parameters on the command line.
  if (argc < 3)
  {
    std::cerr << "Missing parameters. " << std::endl;
    std::cerr << "Usage: " << std::endl;
    std::cerr << argv[0] << " inputImageFile numberOfSamples" << std::endl;
    return EXIT_FAILURE;
  }

  // Software Guide : BeginCodeSnippet
  constexpr unsigned int Dimension = 2;

  using PixelType = unsigned short;
  using ImageType = itk::Image<PixelType, Dimension>;
  using ConstIteratorType = itk::ImageRandomConstIteratorWithIndex<ImageType>;
  // Software Guide : EndCodeSnippet

  using ReaderType = itk::ImageFileReader<ImageType>;

  ImageType::ConstPointer inputImage;
  auto                    reader = ReaderType::New();
  reader->SetFileName(argv[1]);
  try
  {
    reader->Update();
    inputImage = reader->GetOutput();
  }
  catch (const itk::ExceptionObject & err)
  {
    std::cerr << "ExceptionObject caught !" << std::endl;
    std::cerr << err << std::endl;
    return EXIT_FAILURE;
  }

  // Software Guide : BeginLatex
  //
  // The input image has been read as \code{inputImage}.  We now create an
  // iterator with a number of samples set by command line argument. The call
  // to \code{ReinitializeSeed} seeds the random number generator.  The
  // iterator is initialized over the entire valid image region.
  //
  //  \index{itk::Image\-Random\-Const\-Iterator\-With\-Index!SetNumberOfSamples()}
  //  \index{itk::Image\-Random\-Const\-Iterator\-With\-Index!ReinitializeSeed()}
  // Software Guide : EndLatex

  // Software Guide : BeginCodeSnippet
  ConstIteratorType inputIt(inputImage, inputImage->GetRequestedRegion());
  inputIt.SetNumberOfSamples(std::stoi(argv[2]));
  inputIt.ReinitializeSeed();
  // Software Guide : EndCodeSnippet

  // Software Guide: BeginLatex
  //
  // Now take the specified number of samples and calculate their average
  // value.
  //
  // Software Guide : EndLatex

  // Software Guide : BeginCodeSnippet
  float mean = 0.0f;
  for (inputIt.GoToBegin(); !inputIt.IsAtEnd(); ++inputIt)
  {
    mean += static_cast<float>(inputIt.Get());
  }
  mean = mean / std::stod(argv[2]);

  // Software Guide : EndCodeSnippet
  std::cout << "Mean estimate with " << argv[2] << " samples is " << mean
            << std::endl;

  // Software Guide : BeginLatex
  //
  /*
   The following table shows the results
   of running this example on several of the data files from
   \code{Examples/Data} with a range of sample sizes.

   \begin{table}
   \begin{center}
   \begin{tabular}[]{rc|c|c|c}
   & \multicolumn{4}{c}{\emph{Sample Size}} \\  & \code{\textbf{10}} &
   \code{\textbf{100}} & \code{\textbf{1000}} & \code{\textbf{10000}} \\
   \cline{2-5} \code{RatLungSlice1.mha} & 50.5 & 52.4 & 53.0 & 52.4 \\
   \code{RatLungSlice2.mha} & 46.7 & 47.5 & 47.4 & 47.6  \\
   \code{BrainT1Slice.png} & 47.2 & 64.1 & 68.0 & 67.8  \\ \end{tabular}
   \itkcaption[ImageRandomConstIteratorWithIndex usage]{Estimates of mean
   image pixel value using the ImageRandomConstIteratorWithIndex at
   different sample sizes.} \end{center}
   \label{tab:ImageRandomConstIteratorWithIndexExample}
   \end{table}

   \index{itk::Image\-Random\-Const\-Iterator\-With\-Index!example of
   using|)}
  */
  // Software Guide : EndLatex

  return EXIT_SUCCESS;
}