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 ======================================================================-====*/
19 #ifndef CLITKCROPLIKEIMAGEFILTER_TXX
20 #define CLITKCROPLIKEIMAGEFILTER_TXX
23 #include "clitkCommon.h"
26 #include "itkRegionOfInterestImageFilter.h"
29 //--------------------------------------------------------------------
30 template <class ImageType>
31 clitk::CropLikeImageFilter<ImageType>::
32 CropLikeImageFilter():itk::ImageToImageFilter<ImageType, ImageType>() {
33 this->SetNumberOfRequiredInputs(1);
35 m_LikeFilenameIsGiven = false;
36 m_CropAlongThisDimension.resize(ImageType::ImageDimension);
37 for(uint i=0; i<ImageType::ImageDimension; i++)
38 m_CropAlongThisDimension[i] = true;
40 //--------------------------------------------------------------------
43 //--------------------------------------------------------------------
44 template <class ImageType>
46 clitk::CropLikeImageFilter<ImageType>::
47 SetCropLikeFilename(std::string f)
50 m_LikeFilenameIsGiven = true;
52 //--------------------------------------------------------------------
55 //--------------------------------------------------------------------
56 template <class ImageType>
58 clitk::CropLikeImageFilter<ImageType>::
59 SetCropLikeImage(const itk::ImageBase<ImageType::ImageDimension> * like)
63 //--------------------------------------------------------------------
66 //--------------------------------------------------------------------
67 template <class ImageType>
69 clitk::CropLikeImageFilter<ImageType>::
70 SetCropLikeImage(const itk::ImageBase<ImageType::ImageDimension> * like, int axe)
73 for(uint i=0; i<ImageType::ImageDimension; i++)
74 m_CropAlongThisDimension[i] = false;
75 m_CropAlongThisDimension[axe] = true;
77 //--------------------------------------------------------------------
80 //--------------------------------------------------------------------
81 template <class ImageType>
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 ));
88 //--------------------------------------------------------------------
91 //--------------------------------------------------------------------
92 template <class ImageType>
94 clitk::CropLikeImageFilter<ImageType>::
95 GenerateOutputInformation() {
97 ImageConstPointer input = dynamic_cast<const ImageType*>(itk::ProcessObject::GetInput(0));
100 ImagePointer output = this->GetOutput(0);
103 typename ImageType::SizeType likeSize;
104 typename ImageType::IndexType likeStart;
105 typename ImageType::PointType likeOrigin;
106 typename ImageType::SpacingType likeSpacing;
108 likeSize = m_LikeImage->GetLargestPossibleRegion().GetSize();
109 likeStart = m_LikeImage->GetLargestPossibleRegion().GetIndex();
110 likeOrigin = m_LikeImage->GetOrigin();
111 likeSpacing = m_LikeImage->GetSpacing();
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);
124 clitkExceptionMacro("You should provide SetCropLikeFilename or SetCropLike to CropLikeImageFilter");
129 typename ImageType::SizeType size;
130 typename ImageType::IndexType start;
131 for(unsigned int i=0; i<ImageType::ImageDimension; i++) {
133 if (m_CropAlongThisDimension[i]) {
134 size[i] = likeSize[i];
138 size[i] = input->GetLargestPossibleRegion().GetSize()[i];
139 ol = input->GetOrigin()[i];
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] << ".");
151 m_Region.SetSize(size);
152 m_Region.SetIndex(start);
153 output->SetRegions(m_Region);
154 output->SetSpacing(input->GetSpacing());
156 //--------------------------------------------------------------------
158 //--------------------------------------------------------------------
159 template <class ImageType>
161 clitk::CropLikeImageFilter<ImageType>::
163 // Get input pointers
164 ImageConstPointer input = dynamic_cast<const ImageType*>(itk::ProcessObject::GetInput(0));
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();
173 // Get (graft) output (SetNthOutput does not fit here because of Origin).
174 this->GraftOutput(cropFilter->GetOutput());
176 //--------------------------------------------------------------------
179 #endif //#define CLITKAUTOCROPFILTER