]> Creatis software - clitk.git/blob - itk/clitkSliceBySliceRelativePositionFilter.txx
relative position 2D slice by slice (attempt)
[clitk.git] / itk / clitkSliceBySliceRelativePositionFilter.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 // clitk
20 #include "clitkSegmentationUtils.h"
21 // #include "clitkBooleanOperatorLabelImageFilter.h"
22 // #include "clitkAutoCropFilter.h"
23 // #include "clitkResampleImageWithOptionsFilter.h"
24 // #include "clitkBooleanOperatorLabelImageFilter.h"
25 #include "clitkExtractSliceFilter.h"
26
27 // // itk
28 // #include <deque>
29 // #include "itkStatisticsLabelMapFilter.h"
30 // #include "itkLabelImageToStatisticsLabelMapFilter.h"
31 // #include "itkRegionOfInterestImageFilter.h"
32 // #include "itkBinaryThresholdImageFilter.h"
33 // #include "itkBinaryErodeImageFilter.h"
34 // #include "itkBinaryBallStructuringElement.h"
35
36 // // itk [Bloch et al] 
37 // #include "RelativePositionPropImageFilter.h"
38
39 //--------------------------------------------------------------------
40 template <class ImageType>
41 clitk::SliceBySliceRelativePositionFilter<ImageType>::
42 SliceBySliceRelativePositionFilter():
43   clitk::FilterBase(),
44   itk::ImageToImageFilter<ImageType, ImageType>()
45 {
46   this->SetNumberOfRequiredInputs(2);
47   SetDirection(2);
48   SetObjectBackgroundValue(0);
49 }
50 //--------------------------------------------------------------------
51
52
53 //--------------------------------------------------------------------
54 template <class ImageType>
55 void 
56 clitk::SliceBySliceRelativePositionFilter<ImageType>::
57 SetInput(const ImageType * image) {
58   // Process object is not const-correct so the const casting is required.
59   this->SetNthInput(0, const_cast<ImageType *>(image));
60 }
61 //--------------------------------------------------------------------
62   
63
64 //--------------------------------------------------------------------
65 template <class ImageType>
66 void 
67 clitk::SliceBySliceRelativePositionFilter<ImageType>::
68 SetInputObject(const ImageType * image) {
69   // Process object is not const-correct so the const casting is required.
70   this->SetNthInput(1, const_cast<ImageType *>(image));
71 }
72 //--------------------------------------------------------------------
73   
74
75 //--------------------------------------------------------------------
76 template <class ImageType>
77 void 
78 clitk::SliceBySliceRelativePositionFilter<ImageType>::
79 GenerateOutputInformation() { 
80   ImagePointer input = dynamic_cast<ImageType*>(itk::ProcessObject::GetInput(0));
81   ImagePointer outputImage = this->GetOutput(0);
82   outputImage->SetRegions(input->GetLargestPossibleRegion());
83 }
84 //--------------------------------------------------------------------
85
86
87 //--------------------------------------------------------------------
88 template <class ImageType>
89 void 
90 clitk::SliceBySliceRelativePositionFilter<ImageType>::
91 GenerateInputRequestedRegion() {
92   // Call default
93   itk::ImageToImageFilter<ImageType, ImageType>::GenerateInputRequestedRegion();
94   // Get input pointers and set requested region to common region
95   ImagePointer input1 = dynamic_cast<ImageType*>(itk::ProcessObject::GetInput(0));
96   ImagePointer input2 = dynamic_cast<ImageType*>(itk::ProcessObject::GetInput(1));
97   input1->SetRequestedRegion(input1->GetLargestPossibleRegion());
98   input2->SetRequestedRegion(input2->GetLargestPossibleRegion());
99 }
100 //--------------------------------------------------------------------
101
102   
103 //--------------------------------------------------------------------
104 template <class ImageType>
105 void 
106 clitk::SliceBySliceRelativePositionFilter<ImageType>::
107 GenerateData() {
108   // Get input pointer
109   input = dynamic_cast<ImageType*>(itk::ProcessObject::GetInput(0));
110   object = dynamic_cast<ImageType*>(itk::ProcessObject::GetInput(1));
111
112   //--------------------------------------------------------------------
113   // Resample object to the same spacing than input
114   if (!clitk::HaveSameSpacing<ImageType, ImageType>(object, input)) {
115     StartNewStep("Resample object to the same spacing than input");
116     m_working_object = clitk::ResampleImageSpacing<ImageType>(object, input->GetSpacing());
117     StopCurrentStep<ImageType>(m_working_object);
118   }
119   else {
120     DD("no resampling");
121     m_working_object = object;
122   }
123   
124   //--------------------------------------------------------------------
125   // Pad object to the same size than input
126   if (!clitk::HaveSameSizeAndSpacing<ImageType, ImageType>(m_working_object, input)) {
127     StartNewStep("Pad object to the same size than input");
128     m_working_object = clitk::EnlargeImageLike<ImageType>(m_working_object, 
129                                                           input, 
130                                                           GetObjectBackgroundValue());
131     StopCurrentStep<ImageType>(m_working_object);
132   }
133   else {
134     DD("no pad");
135   }
136   
137   /*
138
139
140   //--------------------------------------------------------------------
141   // Extract input slices
142   StartNewStep("Extract input slices");
143   typedef clitk::ExtractSliceFilter<ImageType> ExtractSliceFilterType;
144   typename ExtractSliceFilterType::Pointer extractSliceFilter = Extractslicefilter::New();
145   extractSliceFilter->SetInput(input);
146   extractSliceFilter->SetDirection(GetDirection());
147   extractSliceFilter->Update();
148   typedef typename ExtractSliceFilterType::SliceType SliceType;
149   std::vector<typename SliceType::Pointer> & mInputSlices = extractSliceFilter->GetOutput();
150   DD(mInputSlices.size());
151   StopCurrentStep<SliceType>(mInputSlices[5]);
152   
153   //--------------------------------------------------------------------
154   // Extract object slices
155
156   StartNewStep("Extract object slices");
157   extractSliceFilter = Extractslicefilter::New();
158   extractSliceFilter->SetInput(input);
159   extractSliceFilter->SetDirection(GetDirection());
160   extractSliceFilter->Update();
161   std::vector<typename SliceType::Pointer> & mObjectSlices = extractSliceFilter->GetOutput();
162   DD(mObjectSlices.size());
163   StopCurrentStep<SliceType>(mInputSlices[5]);
164
165   
166   //--------------------------------------------------------------------
167   // Perform slice by slice relative position
168   StartNewStep("Perform slice by slice relative position");
169   for(int i=0; i<mInputSlices.size(); i++) {
170     DD(i);
171     typedef clitk::AddRelativePositionConstraintToLabelImageFilter<SliceType> RelPosFilterType;
172     typename RelPosFilterType::Pointer relPosFilter = RelPosFilterType::New();
173     relPosFilter->VerboseStepOff();
174     relPosFilter->WriteStepOff();
175     relPosFilter->SetInput(mInputSlices[i]); 
176     relPosFilter->SetInputObject(mObjectSlices[i]); 
177     relPosFilter->SetOrientationType(GetOrientationType());
178     relPosFilter->SetIntermediateSpacing(GetIntermediateSpacing());
179     relPosFilter->SetFuzzyThreshold(GetFuzzyThreshold());
180     relPosFilter->Update();
181     mInputSlices[i] = relPosFilter->GetOutput();
182   }
183   typedef itk::JoinSeriesImageFilter<SliceType, ImageType> JointSeriesFilterType;
184   typename JointSeriesFilterType::Pointer jointFilter = JointSeriesFilterType::New();
185   for(int i=0; i<mInputSlices.size(); i++) {
186     jointFilter->SetInput(i, mInputSlices[i]);
187   }
188   m_working_input = jointFilter->GetOutput();
189   DD(m_working_input->GetSpacing());
190   DD(m_working_input->GetOrigin());
191   StopCurrentStep<ImageType>(m_working_input);
192
193   */
194
195
196   //--------------------------------------------------------------------
197   //--------------------------------------------------------------------  
198   // Final Step -> set output
199   this->SetNthOutput(0, m_working_input);
200   return;
201 }
202 //--------------------------------------------------------------------
203