forked from InsightSoftwareConsortium/ITK
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ImageReadExportVTK.cxx
230 lines (195 loc) · 7.44 KB
/
ImageReadExportVTK.cxx
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
/*=========================================================================
*
* Copyright Insight Software Consortium
*
* 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
*
* http://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
//
// In cases where the user knows what file format to use and wants to
// indicate this explicitly, a specific \doxygen{ImageIO} class can be
// instantiated and assigned to the image file reader or writer. This
// circumvents the \doxygen{ImageIOFactory} mechanism which tries to find
// the appropriate ImageIO class for performing the IO operations. Explicit
// selection of the ImageIO also allows the user to invoke specialized
// features of a particular class which may not be available from the
// general API provided by ImageIO.
//
// The following example illustrates explicit instantiation of an IO class
// (in this case a VTK file format), setting its parameters and then
// connecting it to the \doxygen{ImageFileWriter}.
//
// The example begins by including the appropriate headers.
//
// \index{itk::ImageFileReader!header}
// \index{itk::ImageFileWriter!header}
// \index{itk::VTKImageIO!header}
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkVTKImageIO.h"
// Software Guide : EndCodeSnippet
#include "itkImage.h"
int main( int argc, char ** argv )
{
// Verify the number of parameters in the command line
if( argc < 3 )
{
std::cerr << "Usage: " << std::endl;
std::cerr << argv[0] << " inputImageFile outputImageFile " << std::endl;
return EXIT_FAILURE;
}
// Software Guide : BeginLatex
//
// Then, as usual, we select the pixel types and the image
// dimension. Remember, if the file format represents pixels with a
// particular type, C-style casting will be performed to convert the data.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
typedef unsigned short PixelType;
const unsigned int Dimension = 2;
typedef itk::Image< PixelType, Dimension > ImageType;
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We can now instantiate the reader and writer. These two classes are
// parameterized over the image type. We instantiate the
// \doxygen{VTKImageIO} class as well. Note that the ImageIO objects are
// not templated.
//
// \index{itk::ImageFileReader!Instantiation}
// \index{itk::ImageFileWriter!Instantiation}
// \index{itk::VTKImageIO!Instantiation}
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
typedef itk::ImageFileReader< ImageType > ReaderType;
typedef itk::ImageFileWriter< ImageType > WriterType;
typedef itk::VTKImageIO ImageIOType;
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// Then, we create one object of each type using the New() method and
// assigning the result to a \doxygen{SmartPointer}.
//
// \index{itk::ImageFileReader!New()}
// \index{itk::ImageFileWriter!New()}
// \index{itk::ImageFileReader!SmartPointer}
// \index{itk::ImageFileWriter!SmartPointer}
// \index{itk::VTKImageIO!New()}
// \index{itk::VTKImageIO!SmartPointer}
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
ImageIOType::Pointer vtkIO = ImageIOType::New();
// Software Guide : EndCodeSnippet
//
// Here we recover the file names from the command line arguments
//
const char * inputFilename = argv[1];
const char * outputFilename = argv[2];
// Software Guide : BeginLatex
//
// The name of the file to be read or written is passed with the
// SetFileName() method.
//
// \index{itk::ImageFileReader!SetFileName()}
// \index{itk::ImageFileWriter!SetFileName()}
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
reader->SetFileName( inputFilename );
writer->SetFileName( outputFilename );
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// We can now connect these readers and writers to filters in a
// pipeline. For example, we can create a short pipeline by passing the
// output of the reader directly to the input of the writer.
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
writer->SetInput( reader->GetOutput() );
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// Explicitly declaring the specific VTKImageIO allow users to
// invoke methods specific to a particular IO class. For example, the
// following line specifies to the writer to use ASCII format when writing
// the pixel data.
//
// \index{itk::VTKImageIO!SetFileTypeToASCII()}
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
vtkIO->SetFileTypeToASCII();
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// The VTKImageIO object is then connected to the
// ImageFileWriter. This will short-circuit the action of the
// ImageIOFactory mechanism. The ImageFileWriter will
// not attempt to look for other ImageIO objects capable of
// performing the writing tasks. It will simply invoke the one provided by
// the user.
//
// \index{itk::ImageFileWriter!SetImageIO()}
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
writer->SetImageIO( vtkIO );
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// Finally we invoke Update() on the ImageFileWriter and
// place this call inside a try/catch block in case any errors occur during
// the writing process.
//
// \index{itk::ImageFileWriter!SetImageIO()}
//
// Software Guide : EndLatex
// Software Guide : BeginCodeSnippet
try
{
writer->Update();
}
catch( itk::ExceptionObject & err )
{
std::cerr << "ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
return EXIT_FAILURE;
}
// Software Guide : EndCodeSnippet
// Software Guide : BeginLatex
//
// Although this example only illustrates how to use an explicit
// ImageIO class with the ImageFileWriter, the same
// can be done with the ImageFileReader. The typical case in
// which this is done is when reading raw image files with the
// \doxygen{RawImageIO} object. The drawback of this approach is that the
// parameters of the image have to be explicitly written in the code. The
// direct use of raw files is \textbf{strongly discouraged} in medical
// imaging. It is always better to create a header for a raw file by
// using any of the file formats that combine a text header file and a raw
// binary file, like \doxygen{MetaImageIO}, \doxygen{GiplImageIO} and
// \doxygen{VTKImageIO}.
//
// Software Guide : EndLatex
return EXIT_SUCCESS;
}