]> Creatis software - clitk.git/blob - itk/clitkCropLikeImageFilter.txx
new CropImage with AutoCrop and CropLike
[clitk.git] / itk / clitkCropLikeImageFilter.txx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to: 
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17   ======================================================================-====*/
18
19 #ifndef CLITKCROPLIKEIMAGEFILTER_TXX
20 #define CLITKCROPLIKEIMAGEFILTER_TXX
21
22 // clitk
23 #include "clitkCommon.h"
24
25 // itk
26 #include "itkRegionOfInterestImageFilter.h"
27
28
29 //--------------------------------------------------------------------
30 template <class ImageType>
31 clitk::CropLikeImageFilter<ImageType>::
32 CropLikeImageFilter():itk::ImageToImageFilter<ImageType, ImageType>() {
33   this->SetNumberOfRequiredInputs(1);
34   m_LikeImage = NULL;
35   m_LikeFilenameIsGiven = false;
36   m_CropAlongThisDimension.resize(ImageType::ImageDimension);
37   for(uint i=0; i<ImageType::ImageDimension; i++)
38     m_CropAlongThisDimension[i] = true;
39 }
40 //--------------------------------------------------------------------
41
42
43 //--------------------------------------------------------------------
44 template <class ImageType>
45 void 
46 clitk::CropLikeImageFilter<ImageType>::
47 SetCropLikeFilename(std::string f) 
48 {
49   m_LikeFilename = f;
50   m_LikeFilenameIsGiven = true;
51 }
52 //--------------------------------------------------------------------
53   
54
55 //--------------------------------------------------------------------
56 template <class ImageType>
57 void 
58 clitk::CropLikeImageFilter<ImageType>::
59 SetCropLikeImage(const itk::ImageBase<ImageType::ImageDimension> * like)
60 {
61   m_LikeImage = like;
62 }
63 //--------------------------------------------------------------------
64   
65
66 //--------------------------------------------------------------------
67 template <class ImageType>
68 void 
69 clitk::CropLikeImageFilter<ImageType>::
70 SetCropLikeImage(const itk::ImageBase<ImageType::ImageDimension> * like, int axe)
71 {
72   m_LikeImage = like;
73   for(uint i=0; i<ImageType::ImageDimension; i++)
74     m_CropAlongThisDimension[i] = false;
75   m_CropAlongThisDimension[axe] = true;
76 }
77 //--------------------------------------------------------------------
78   
79
80 //--------------------------------------------------------------------
81 template <class ImageType>
82 void 
83 clitk::CropLikeImageFilter<ImageType>::
84 SetInput(const ImageType * image) {
85   // Process object is not const-correct so the const casting is required.
86   this->SetNthInput(0, const_cast<ImageType *>( image ));
87 }
88 //--------------------------------------------------------------------
89   
90
91 //--------------------------------------------------------------------
92 template <class ImageType>
93 void 
94 clitk::CropLikeImageFilter<ImageType>::
95 GenerateOutputInformation() {    
96   // Get input pointers
97   ImageConstPointer input = dynamic_cast<const ImageType*>(itk::ProcessObject::GetInput(0));
98     
99   // Get output pointer
100   ImagePointer output = this->GetOutput(0);
101   
102   // Get input info
103   typename ImageType::SizeType likeSize;
104   typename ImageType::IndexType likeStart;
105   typename ImageType::PointType likeOrigin;  
106   typename ImageType::SpacingType likeSpacing;  
107   if (m_LikeImage) {     
108     likeSize = m_LikeImage->GetLargestPossibleRegion().GetSize();
109     likeStart = m_LikeImage->GetLargestPossibleRegion().GetIndex();
110     likeOrigin = m_LikeImage->GetOrigin();
111     likeSpacing = m_LikeImage->GetSpacing();
112   }
113   else {
114     if (m_LikeFilenameIsGiven) {
115       itk::ImageIOBase::Pointer header = readImageHeader(m_LikeFilename);
116       for(unsigned int i=0; i<ImageType::ImageDimension; i++) {
117         likeSize[i] = header->GetIORegion().GetSize()[i]; //GetDimensions(i);
118         likeStart[i] = header->GetIORegion().GetIndex()[i];
119         likeOrigin[i] = header->GetOrigin(i);
120         likeSpacing[i] = header->GetSpacing(i);
121       }
122     }
123     else {
124       clitkExceptionMacro("You should provide SetCropLikeFilename or SetCropLike to CropLikeImageFilter");
125     }
126   }
127
128   // Compute region
129   typename ImageType::SizeType size;
130   typename ImageType::IndexType start;
131   for(unsigned int i=0; i<ImageType::ImageDimension; i++) {
132     double ol;
133     if (m_CropAlongThisDimension[i]) {
134       size[i] = likeSize[i];
135       ol = likeOrigin[i];
136     }
137     else {
138       size[i] = input->GetLargestPossibleRegion().GetSize()[i];
139       ol = input->GetOrigin()[i];
140     }
141     double oi = input->GetOrigin()[i];
142     start[i] = lrint((ol-oi)/input->GetSpacing()[i]);
143     m_Origin[i] = likeOrigin[i];
144     if (likeSpacing[i] != input->GetSpacing()[i]) {
145       clitkExceptionMacro("Images must have the same spacing, but input's spacing(" << i
146                           <<") is " << input->GetSpacing()[i] << " while like's spacing(" << i 
147                           << ") is " << likeSpacing[i] << ".");
148     }
149   }
150
151   m_Region.SetSize(size);
152   m_Region.SetIndex(start);
153   output->SetRegions(m_Region);
154   output->SetSpacing(input->GetSpacing());
155 }
156 //--------------------------------------------------------------------
157    
158 //--------------------------------------------------------------------
159 template <class ImageType>
160 void 
161 clitk::CropLikeImageFilter<ImageType>::
162 GenerateData() {
163   // Get input pointers
164   ImageConstPointer input = dynamic_cast<const ImageType*>(itk::ProcessObject::GetInput(0));
165   
166   typedef itk::RegionOfInterestImageFilter<ImageType, ImageType> CropFilterType;
167   typename CropFilterType::Pointer cropFilter = CropFilterType::New();
168   cropFilter->SetInput(input);
169   cropFilter->SetReleaseDataFlag(this->GetReleaseDataFlag());
170   cropFilter->SetRegionOfInterest(m_Region);
171   cropFilter->Update();
172
173   // Get (graft) output (SetNthOutput does not fit here because of Origin).
174   this->GraftOutput(cropFilter->GetOutput());
175 }
176 //--------------------------------------------------------------------
177    
178  
179 #endif //#define CLITKAUTOCROPFILTER