00001 /*========================================================================= 00002 00003 Program: Insight Segmentation & Registration Toolkit 00004 Module: $RCSfile: Image1.cxx,v $ 00005 Language: C++ 00006 Date: $Date: 2005-02-08 03:51:52 $ 00007 Version: $Revision: 1.21 $ 00008 00009 Copyright (c) Insight Software Consortium. All rights reserved. 00010 See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. 00011 00012 This software is distributed WITHOUT ANY WARRANTY; without even 00013 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00014 PURPOSE. See the above copyright notices for more information. 00015 00016 =========================================================================*/ 00017 #if defined(_MSC_VER) 00018 #pragma warning ( disable : 4786 ) 00019 #endif 00020 00021 // Software Guide : BeginLatex 00022 // 00023 // This example illustrates how to manually construct an \doxygen{Image} 00024 // class. The following is the minimal code needed to instantiate, declare 00025 // and create the image class. 00026 // 00027 // \index{itk::Image!Instantiation} 00028 // \index{itk::Image!Header} 00029 // 00030 // First, the header file of the Image class must be included. 00031 // 00032 // Software Guide : EndLatex 00033 00034 00035 // Software Guide : BeginCodeSnippet 00036 #include "itkImage.h" 00037 // Software Guide : EndCodeSnippet 00038 00039 00040 00041 int main(int, char *[]) 00042 { 00043 // Software Guide : BeginLatex 00044 // 00045 // Then we must decide with what type to represent the pixels 00046 // and what the dimension of the image will be. With these two 00047 // parameters we can instantiate the image class. Here we create 00048 // a 3D image with \code{unsigned short} pixel data. 00049 // 00050 // Software Guide : EndLatex 00051 // 00052 // Software Guide : BeginCodeSnippet 00053 typedef itk::Image< unsigned short, 3 > ImageType; 00054 // Software Guide : EndCodeSnippet 00055 00056 00057 // Software Guide : BeginLatex 00058 // 00059 // The image can then be created by invoking the \code{New()} operator 00060 // from the corresponding image type and assigning the result 00061 // to a \doxygen{SmartPointer}. 00062 // 00063 // \index{itk::Image!Pointer} 00064 // \index{itk::Image!New()} 00065 // 00066 // Software Guide : EndLatex 00067 // 00068 // Software Guide : BeginCodeSnippet 00069 ImageType::Pointer image = ImageType::New(); 00070 // Software Guide : EndCodeSnippet 00071 00072 00073 // Software Guide : BeginLatex 00074 // 00075 // In ITK, images exist in combination with one or more 00076 // \emph{regions}. A region is a subset of the image and indicates a 00077 // portion of the image that may be processed by other classes in 00078 // the system. One of the most common regions is the 00079 // \emph{LargestPossibleRegion}, which defines the image in its 00080 // entirety. Other important regions found in ITK are the 00081 // \emph{BufferedRegion}, which is the portion of the image actually 00082 // maintained in memory, and the \emph{RequestedRegion}, which is 00083 // the region requested by a filter or other class when operating on 00084 // the image. 00085 // 00086 // In ITK, manually creating an image requires that the image is 00087 // instantiated as previously shown, and that regions describing the image are 00088 // then associated with it. 00089 // 00090 // A region is defined by two classes: the \doxygen{Index} and 00091 // \doxygen{Size} classes. The origin of the region within the 00092 // image with which it is associated is defined by Index. The 00093 // extent, or size, of the region is defined by Size. Index 00094 // is represented by a n-dimensional array where each component is an 00095 // integer indicating---in topological image coordinates---the initial 00096 // pixel of the image. When an image is created manually, the user is 00097 // responsible for defining the image size and the index at which the image 00098 // grid starts. These two parameters make it possible to process selected 00099 // regions. 00100 // 00101 // The starting point of the image is defined by an Index class 00102 // that is an n-dimensional array where each component is an integer 00103 // indicating the grid coordinates of the initial pixel of the image. 00104 // 00105 // \index{itk::Image!Size} 00106 // \index{itk::Image!SizeType} 00107 // 00108 // Software Guide : EndLatex 00109 // 00110 // Software Guide : BeginCodeSnippet 00111 ImageType::IndexType start; 00112 00113 start[0] = 0; // first index on X 00114 start[1] = 0; // first index on Y 00115 start[2] = 0; // first index on Z 00116 // Software Guide : EndCodeSnippet 00117 00118 // Software Guide : BeginLatex 00119 // 00120 // The region size is represented by an array of the same dimension of the 00121 // image (using the Size class). The components of the array are 00122 // unsigned integers indicating the extent in pixels of the image along 00123 // every dimension. 00124 // 00125 // \index{itk::Image!Index} 00126 // \index{itk::Image!IndexType} 00127 // 00128 // Software Guide : EndLatex 00129 // 00130 // Software Guide : BeginCodeSnippet 00131 ImageType::SizeType size; 00132 00133 size[0] = 200; // size along X 00134 size[1] = 200; // size along Y 00135 size[2] = 200; // size along Z 00136 // Software Guide : EndCodeSnippet 00137 00138 // Software Guide : BeginLatex 00139 // 00140 // Having defined the starting index and the image size, these two 00141 // parameters are used to create an ImageRegion object which basically 00142 // encapsulates both concepts. The region is initialized with the 00143 // starting index and size of the image. 00144 // 00145 // \index{itk::Image!itk::ImageRegion} 00146 // \index{itk::Image!RegionType} 00147 // 00148 // Software Guide : EndLatex 00149 00150 // Software Guide : BeginCodeSnippet 00151 ImageType::RegionType region; 00152 00153 region.SetSize( size ); 00154 region.SetIndex( start ); 00155 // Software Guide : EndCodeSnippet 00156 00157 // Software Guide : BeginLatex 00158 // 00159 // Finally, the region is passed to the \code{Image} object in order to define its 00160 // extent and origin. The \code{SetRegions} method sets the 00161 // LargestPossibleRegion, BufferedRegion, and RequestedRegion 00162 // simultaneously. Note that none of the operations performed to this point 00163 // have allocated memory for the image pixel data. It is necessary to 00164 // invoke the \code{Allocate()} method to do this. Allocate does not 00165 // require any arguments since all the information needed for memory 00166 // allocation has already been provided by the region. 00167 // 00168 // \index{itk::Image!Allocate()} 00169 // \index{itk::Image!SetRegions()} 00170 // 00171 // Software Guide : EndLatex 00172 00173 // Software Guide : BeginCodeSnippet 00174 image->SetRegions( region ); 00175 image->Allocate(); 00176 // Software Guide : EndCodeSnippet 00177 00178 return 0; 00179 } 00180