17 #ifndef __itkPermuteAxesImageFilter_txx
18 #define __itkPermuteAxesImageFilter_txx
31 template <
class TImage>
35 for (
unsigned int j = 0; j < ImageDimension; j++ )
38 m_InverseOrder[m_Order[j]] = j;
47 template <
class TImage>
52 Superclass::PrintSelf(os,indent);
56 os << indent <<
"Order: [";
57 for( j = 0; j < ImageDimension - 1; j++ )
59 os << m_Order[j] <<
", ";
61 os << m_Order[j] <<
"]" << std::endl;
63 os << indent <<
"InverseOrder: [";
64 for( j = 0; j < ImageDimension - 1; j++ )
66 os << m_InverseOrder[j] <<
", ";
68 os << m_InverseOrder[j] <<
"]" << std::endl;
77 template <
class TImage>
86 if ( m_Order == order )
return;
93 for ( j = 0; j < ImageDimension; j++ )
95 if ( order[j] > ImageDimension - 1 )
102 else if ( used[order[j]] )
109 used[order[j]] =
true;
115 for ( j = 0; j < ImageDimension; j++ )
117 m_InverseOrder[m_Order[j]] = j;
127 template <
class TImage>
133 Superclass::GenerateOutputInformation();
139 if( !inputPtr || !outputPtr )
144 const typename TImage::SpacingType& inputSpacing = inputPtr->GetSpacing();
145 const typename TImage::PointType& inputOrigin = inputPtr->GetOrigin();
146 const typename TImage::DirectionType& inputDirection = inputPtr->GetDirection();
147 const typename TImage::SizeType& inputSize =
148 inputPtr->GetLargestPossibleRegion().GetSize();
149 const typename TImage::IndexType& inputStartIndex =
150 inputPtr->GetLargestPossibleRegion().GetIndex();
153 typename TImage::SpacingType outputSpacing;
154 typename TImage::PointType outputOrigin;
155 typename TImage::DirectionType outputDirection;
156 typename TImage::SizeType outputSize;
157 typename TImage::IndexType outputStartIndex;
160 for ( j = 0; j < ImageDimension; j++ )
164 outputOrigin[j] = inputOrigin[j];
166 outputSpacing[j] = inputSpacing[m_Order[j]];
167 outputSize[j] = inputSize[m_Order[j]];
168 outputStartIndex[j] = inputStartIndex[m_Order[j]];
169 for ( i = 0; i < ImageDimension; i++ )
171 outputDirection[i][j] = inputDirection[i][m_Order[j]];
175 outputPtr->SetSpacing( outputSpacing );
176 outputPtr->SetOrigin( outputOrigin );
177 outputPtr->SetDirection( outputDirection );
179 typename TImage::RegionType outputRegion;
180 outputRegion.SetSize( outputSize );
181 outputRegion.SetIndex( outputStartIndex );
183 outputPtr->SetLargestPossibleRegion( outputRegion );
192 template <
class TImage>
198 Superclass::GenerateInputRequestedRegion();
202 const_cast< TImage *
>( this->GetInput() );
205 if( !inputPtr || !outputPtr )
210 const typename TImage::SizeType& outputSize =
211 outputPtr->GetRequestedRegion().GetSize();
212 const typename TImage::IndexType& outputIndex =
213 outputPtr->GetRequestedRegion().GetIndex();
215 typename TImage::SizeType inputSize;
216 typename TImage::IndexType inputIndex;
219 for ( j = 0; j < ImageDimension; j++ )
221 inputSize[j] = outputSize[m_InverseOrder[j]];
222 inputIndex[j] = outputIndex[m_InverseOrder[j]];
225 typename TImage::RegionType inputRegion;
226 inputRegion.SetSize( inputSize );
227 inputRegion.SetIndex( inputIndex );
229 inputPtr->SetRequestedRegion( inputRegion );
237 template <
class TImage>
252 OutputIterator outIt(outputPtr, outputRegionForThread);
254 typename TImage::IndexType outputIndex;
255 typename TImage::IndexType inputIndex;
258 ProgressReporter progress(
this, threadId, outputRegionForThread.GetNumberOfPixels());
261 for ( i = 0; !outIt.IsAtEnd(); ++outIt, i++ )
264 outputIndex = outIt.GetIndex();
267 for ( j = 0; j < ImageDimension; j++ )
269 inputIndex[j] = outputIndex[ m_InverseOrder[j] ];
273 outIt.Set( inputPtr->GetPixel(inputIndex) );