1 #ifndef CLITKIMAGECOMMON_TXX
2 #define CLITKIMAGECOMMON_TXX
5 -------------------------------------------------
6 * @file clitkImageCommon.txx
7 * @author David Sarrut <david.sarrut@creatis.insa-lyon.fr>
8 * @date 07 Sep 2007 11:34:19
13 -------------------------------------------------*/
15 //--------------------------------------------------------------------
16 template<class PixelType>
17 typename itk::Image<PixelType,1>::Pointer NewImage1D(int vsize, double vspacing) {
18 typedef itk::Image<PixelType,1> ImageType;
19 typename ImageType::Pointer g = ImageType::New();
20 typename ImageType::SizeType size;
22 typename ImageType::RegionType region;
24 g->SetRegions(region);
25 typename ImageType::SpacingType spacing;
26 spacing[0] = vspacing;
27 g->SetSpacing(spacing);
30 //--------------------------------------------------------------------
32 //--------------------------------------------------------------------
33 template<class PixelType>
34 typename itk::Image<PixelType,2>::Pointer NewImage2D(int sx, int sy, double dx, double dy) {
35 typedef itk::Image<PixelType,2> ImageType;
36 typename ImageType::Pointer g = ImageType::New();
37 typename ImageType::SizeType size;
38 size[0] = sx; size[1] = sy;
39 typename ImageType::RegionType region;
41 g->SetRegions(region);
42 typename ImageType::SpacingType spacing;
43 spacing[0] = dx; spacing[1] = dy;
44 g->SetSpacing(spacing);
47 //--------------------------------------------------------------------
49 //--------------------------------------------------------------------
50 template<class PixelType>
51 typename itk::Image<PixelType,3>::Pointer NewImage3D(int sx, int sy, int sz, double dx, double dy, double dz) {
52 typedef itk::Image<PixelType,3> ImageType;
53 typename ImageType::Pointer g = ImageType::New();
54 typename ImageType::SizeType size;
55 size[0] = sx; size[1] = sy; size[2] = sz;
56 typename ImageType::RegionType region;
58 g->SetRegions(region);
59 typename ImageType::SpacingType spacing;
60 spacing[0] = dx; spacing[1] = dy; spacing[2] = dz;
61 g->SetSpacing(spacing);
64 //--------------------------------------------------------------------
66 //--------------------------------------------------------------------
67 template<class PixelType>
68 typename itk::Image<PixelType,4>::Pointer NewImage4D(int sx, int sy, int sz, int st, double dx, double dy, double dz, double dt) {
69 typedef itk::Image<PixelType,3> ImageType;
70 typename ImageType::Pointer g = ImageType::New();
71 typename ImageType::SizeType size;
72 size[0] = sx; size[1] = sy; size[2] = sz; size[3] = st;
73 typename ImageType::RegionType region;
75 g->SetRegions(region);
76 typename ImageType::SpacingType spacing;
77 spacing[0] = dx; spacing[1] = dy; spacing[2] = dz; spacing[3] = dt;
78 g->SetSpacing(spacing);
81 //--------------------------------------------------------------------
83 //--------------------------------------------------------------------
84 template<class ImageType>
85 typename ImageType::Pointer readImage(const std::string & filename, const bool verbose) {
86 typedef itk::ImageFileReader<ImageType> ReaderType;
87 typename ReaderType::Pointer reader = ReaderType::New();
88 reader->SetFileName(filename.c_str());
90 std::cout << "Reading [" << filename << "] ... " << std::endl;
95 catch(itk::ExceptionObject & err) {
96 std::cerr << "Exception while reading image [" << filename << "]" << std::endl;
97 std::cerr << err << std::endl;
100 return reader->GetOutput();
102 //--------------------------------------------------------------------
104 //--------------------------------------------------------------------
105 template<typename ImageType>
106 typename ImageType::Pointer readImage(const std::vector<std::string> & filenames,
107 const bool verbose) {
108 if (filenames.size() == 1) return readImage<ImageType>(filenames[0], verbose);
109 typedef itk::ImageSeriesReader<ImageType> ReaderType;
110 typename ReaderType::Pointer reader = ReaderType::New();
111 reader->SetFileNames(filenames);
113 std::cout << "Reading " << filenames[0] << " and others ..." << std::endl;
118 catch( itk::ExceptionObject & err ) {
119 std::cerr << "Error while reading " << filenames[0]
120 << " or other files ..." << err << std::endl;
123 return reader->GetOutput();
125 //--------------------------------------------------------------------
127 //--------------------------------------------------------------------
128 template<class ImageType>
129 void writeImage(const typename ImageType::Pointer image, const std::string & filename, const bool verbose=false) {
130 typedef itk::ImageFileWriter<ImageType> WriterType;
131 typename WriterType::Pointer writer = WriterType::New();
132 writer->SetFileName(filename.c_str());
133 writer->SetInput(image);
135 std::cout << "Writing [" << filename << "] ... " << std::endl;
140 catch( itk::ExceptionObject & err ) {
141 std::cerr << "Exception while writing image [" << filename << "]" << std::endl;
142 std::cerr << err << std::endl;
146 //--------------------------------------------------------------------
148 //--------------------------------------------------------------------
149 template<class ImageType>
150 void writeImage(const ImageType* image, const std::string & filename, const bool verbose=false) {
151 typedef itk::ImageFileWriter<ImageType> WriterType;
152 typename WriterType::Pointer writer = WriterType::New();
153 writer->SetFileName(filename.c_str());
154 writer->SetInput(image);
156 std::cout << "Writing [" << filename << "] ... " << std::endl;
161 catch( itk::ExceptionObject & err ) {
162 std::cerr << "Exception while writing image [" << filename << "]" << std::endl;
163 std::cerr << err << std::endl;
167 // //--------------------------------------------------------------------
169 // //--------------------------------------------------------------------
170 // template<class ImageType>
171 // void writeImage(const typename ImageType::ConstPointer image, const std::string & filename, const bool verbose=false) {
172 // typedef itk::ImageFileWriter<ImageType> WriterType;
173 // typename WriterType::Pointer writer = WriterType::New();
174 // writer->SetFileName(filename.c_str());
175 // writer->SetInput(image);
177 // std::cout << "Writing [" << filename << "] ... " << std::endl;
182 // catch( itk::ExceptionObject & err ) {
183 // std::cerr << "Exception while writing image [" << filename << "]" << std::endl;
184 // std::cerr << err << std::endl;
189 //--------------------------------------------------------------------
191 //--------------------------------------------------------------------
192 // Compute the number of different intensities in an image
193 template<class ImageType>
194 int ComputeHowManyDifferentIntensity(const typename ImageType::Pointer & image,
195 std::vector<typename ImageType::PixelType> & l)
197 //std::set<typename ImageType::PixelType> listOfIntensities;
198 std::map<typename ImageType::PixelType, bool> listOfIntensities;
199 // listOfIntensities.resize(0);
200 typedef itk::ImageRegionConstIterator<ImageType> ConstIteratorType;
201 ConstIteratorType pi(image, image->GetLargestPossibleRegion());
203 while (!pi.IsAtEnd()) {
204 if (!listOfIntensities[pi.Get()]) listOfIntensities[pi.Get()] = true;
205 // if (std::find(listOfIntensities.begin(),
206 // listOfIntensities.end(),
207 // pi.Get()) == listOfIntensities.end()) {
208 // listOfIntensities.insert(pi.Get());
213 //typename std::set<typename ImageType::PixelType>::const_iterator ppi = listOfIntensities.begin();
214 typename std::map<typename ImageType::PixelType, bool>::const_iterator ppi = listOfIntensities.begin();
215 while (ppi != listOfIntensities.end()) {
216 l.push_back(ppi->first);
220 return listOfIntensities.size();
222 //--------------------------------------------------------------------
224 //--------------------------------------------------------------------
225 template<class InputImageType, class MaskImageType>
226 void ComputeWeightsOfEachClasses(const typename InputImageType::Pointer & input,
227 const typename MaskImageType::Pointer & mask,
228 const std::vector<typename MaskImageType::PixelType> & listOfIntensities,
229 std::map<typename MaskImageType::PixelType,
230 std::map<typename InputImageType::PixelType, double> > & mapOfLabelsAndWeights) {
232 if (input->GetLargestPossibleRegion() != mask->GetLargestPossibleRegion()) {
233 itkGenericExceptionMacro(<< "Input and mask images have not the same size"
235 << "Input = " << input->GetLargestPossibleRegion()
237 << "Mask = " << mask->GetLargestPossibleRegion());
240 // reset weights list
241 mapOfLabelsAndWeights.clear();
244 typedef itk::ImageRegionConstIterator<InputImageType> ConstInputIteratorType;
245 ConstInputIteratorType pi(input, input->GetLargestPossibleRegion());
246 typedef itk::ImageRegionConstIterator<MaskImageType> ConstMaskIteratorType;
247 ConstMaskIteratorType pm(mask, mask->GetLargestPossibleRegion());
250 while (!pi.IsAtEnd()) {
251 mapOfLabelsAndWeights[pm.Get()][pi.Get()]++;
256 //--------------------------------------------------------------------
258 #endif /* end #define CLITKIMAGECOMMON_TXX */