17 #ifndef __itkExtractImageFilter_txx
18 #define __itkExtractImageFilter_txx
34 template <
class TInputImage,
class TOutputImage>
44 template <
class TInputImage,
class TOutputImage>
49 Superclass::PrintSelf(os,indent);
51 os << indent <<
"ExtractionRegion: " << m_ExtractionRegion << std::endl;
52 os << indent <<
"OutputImageRegion: " << m_OutputImageRegion << std::endl;
56 template<
class TInputImage,
class TOutputImage>
63 extractImageRegionCopier(destRegion, srcRegion, m_ExtractionRegion);
67 template <
class TInputImage,
class TOutputImage>
72 m_ExtractionRegion = extractRegion;
74 unsigned int nonzeroSizeCount = 0;
83 for (
unsigned int i = 0; i < InputImageDimension; ++i)
87 outputSize[nonzeroSizeCount] = inputSize[i];
88 outputIndex[nonzeroSizeCount] = extractRegion.GetIndex()[i];
93 if (nonzeroSizeCount != OutputImageDimension)
95 itkExceptionMacro(
"Extraction Region not consistent with output image");
98 m_OutputImageRegion.SetSize(outputSize);
99 m_OutputImageRegion.SetIndex(outputIndex);
112 template <
class TInputImage,
class TOutputImage>
124 if ( !outputPtr || !inputPtr)
130 outputPtr->SetLargestPossibleRegion( m_OutputImageRegion );
145 const typename InputImageType::SpacingType&
147 const typename InputImageType::DirectionType&
148 inputDirection = inputPtr->GetDirection();
149 const typename InputImageType::PointType&
150 inputOrigin = inputPtr->GetOrigin();
152 typename OutputImageType::SpacingType outputSpacing;
153 typename OutputImageType::DirectionType outputDirection;
154 typename OutputImageType::PointType outputOrigin;
156 if ( static_cast<unsigned int>(OutputImageDimension) >
157 static_cast<unsigned int>(InputImageDimension ) )
161 for (i=0; i < InputImageDimension; ++i)
163 outputSpacing[i] = inputSpacing[i];
164 outputOrigin[i] = inputOrigin[i];
165 for (
unsigned int dim = 0; dim < InputImageDimension; ++dim)
167 outputDirection[i][dim] = inputDirection[i][dim];
170 for (; i < OutputImageDimension; ++i)
172 outputSpacing[i] = 1.0;
173 outputOrigin[i] = 0.0;
174 for (
unsigned int dim = 0; dim < InputImageDimension; ++dim)
176 outputDirection[i][dim] = 0.0;
178 outputDirection[i][i] = 1.0;
184 outputDirection.SetIdentity();
185 int nonZeroCount = 0;
186 for (i=0; i < InputImageDimension; ++i)
188 if (m_ExtractionRegion.GetSize()[i])
190 outputSpacing[nonZeroCount] = inputSpacing[i];
191 outputOrigin[nonZeroCount] = inputOrigin[i];
192 int nonZeroCount2 = 0;
193 for (
unsigned int dim = 0; dim < InputImageDimension; ++dim)
195 if (m_ExtractionRegion.GetSize()[dim])
197 outputDirection[nonZeroCount][nonZeroCount2] =
198 inputDirection[nonZeroCount][dim];
209 if (vnl_determinant(outputDirection.GetVnlMatrix()) == 0.0)
211 outputDirection.SetIdentity();
215 outputPtr->SetSpacing( outputSpacing );
216 outputPtr->SetDirection( outputDirection );
217 outputPtr->SetOrigin( outputOrigin );
218 outputPtr->SetNumberOfComponentsPerPixel(
219 inputPtr->GetNumberOfComponentsPerPixel() );
224 itkExceptionMacro(<<
"itk::ExtractImageFilter::GenerateOutputInformation "
225 <<
"cannot cast input to "
242 template <
class TInputImage,
class TOutputImage>
248 itkDebugMacro(<<
"Actually executing");
255 ProgressReporter progress(
this, threadId, outputRegionForThread.GetNumberOfPixels());
259 this->CallCopyOutputRegionToInputRegion(inputRegionForThread, outputRegionForThread);
265 OutputIterator outIt(outputPtr, outputRegionForThread);
266 InputIterator inIt(inputPtr, inputRegionForThread);
269 while( !outIt.IsAtEnd() )
272 outIt.Set( static_cast<OutputImagePixelType>(inIt.Get()));
275 progress.CompletedPixel();