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;
}
|