1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
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
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.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
20 #include "clitkSegmentationUtils.h"
21 // #include "clitkBooleanOperatorLabelImageFilter.h"
22 // #include "clitkAutoCropFilter.h"
23 // #include "clitkResampleImageWithOptionsFilter.h"
24 // #include "clitkBooleanOperatorLabelImageFilter.h"
25 #include "clitkExtractSliceFilter.h"
29 // #include "itkStatisticsLabelMapFilter.h"
30 // #include "itkLabelImageToStatisticsLabelMapFilter.h"
31 // #include "itkRegionOfInterestImageFilter.h"
32 // #include "itkBinaryThresholdImageFilter.h"
33 // #include "itkBinaryErodeImageFilter.h"
34 // #include "itkBinaryBallStructuringElement.h"
36 // // itk [Bloch et al]
37 // #include "RelativePositionPropImageFilter.h"
39 //--------------------------------------------------------------------
40 template <class ImageType>
41 clitk::SliceBySliceRelativePositionFilter<ImageType>::
42 SliceBySliceRelativePositionFilter():
44 itk::ImageToImageFilter<ImageType, ImageType>()
46 this->SetNumberOfRequiredInputs(2);
48 SetObjectBackgroundValue(0);
50 //--------------------------------------------------------------------
53 //--------------------------------------------------------------------
54 template <class ImageType>
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));
61 //--------------------------------------------------------------------
64 //--------------------------------------------------------------------
65 template <class ImageType>
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));
72 //--------------------------------------------------------------------
75 //--------------------------------------------------------------------
76 template <class ImageType>
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());
84 //--------------------------------------------------------------------
87 //--------------------------------------------------------------------
88 template <class ImageType>
90 clitk::SliceBySliceRelativePositionFilter<ImageType>::
91 GenerateInputRequestedRegion() {
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());
100 //--------------------------------------------------------------------
103 //--------------------------------------------------------------------
104 template <class ImageType>
106 clitk::SliceBySliceRelativePositionFilter<ImageType>::
109 input = dynamic_cast<ImageType*>(itk::ProcessObject::GetInput(0));
110 object = dynamic_cast<ImageType*>(itk::ProcessObject::GetInput(1));
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);
121 m_working_object = object;
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,
130 GetObjectBackgroundValue());
131 StopCurrentStep<ImageType>(m_working_object);
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]);
153 //--------------------------------------------------------------------
154 // Extract object slices
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]);
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++) {
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();
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]);
188 m_working_input = jointFilter->GetOutput();
189 DD(m_working_input->GetSpacing());
190 DD(m_working_input->GetOrigin());
191 StopCurrentStep<ImageType>(m_working_input);
196 //--------------------------------------------------------------------
197 //--------------------------------------------------------------------
198 // Final Step -> set output
199 this->SetNthOutput(0, m_working_input);
202 //--------------------------------------------------------------------