17 #ifndef __itkGradientImageToBloxBoundaryPointImageFilter_txx
18 #define __itkGradientImageToBloxBoundaryPointImageFilter_txx
27 template<
typename TInputImage >
31 itkDebugMacro(<<
"GradientImageToBloxBoundaryPointImageFilter::GradientImageToBloxBoundaryPointImageFilter() called");
36 for(
unsigned int j = 0; j < NDimensions; j++ )
38 m_BloxResolution[j] = 10.0;
42 template<
typename TInputImage >
48 for( j = 0; j < NDimensions; j++ )
50 if( bloxResolution[j] != m_BloxResolution[j] )
break;
55 for( j = 0; j < Superclass::ImageDimension; j++ )
57 m_BloxResolution[j] = bloxResolution[j];
58 if( m_BloxResolution[j] < 1 )
60 m_BloxResolution[j] = 1;
67 template<
typename TInputImage >
73 for( j = 0; j < NDimensions; j++ )
75 if( bloxResolution != m_BloxResolution[j] )
break;
80 for( j = 0; j < NDimensions; j++ )
82 m_BloxResolution[j] = bloxResolution;
83 if( m_BloxResolution[j] < 1 )
85 m_BloxResolution[j] = 1;
91 template<
typename TInputImage >
96 itkDebugMacro(<<
"GradientImageToBloxBoundaryPointImageFilter::GenerateInputRequestedRegion() called");
99 Superclass::GenerateInputRequestedRegion();
103 const_cast< TInputImage *
>( this->GetInput());
106 if ( !inputPtr || !outputPtr )
113 = outputPtr->GetRequestedRegion().GetSize();
115 = outputPtr->GetRequestedRegion().GetIndex();
118 typedef typename IndexType::IndexValueType IndexValueType;
121 IndexType inputRequestedRegionStartIndex;
123 for (
unsigned int i = 0; i < TInputImage::ImageDimension; i++)
125 inputRequestedRegionSize[i] =
static_cast<SizeValueType
>(
126 outputRequestedRegionSize[i] * m_BloxResolution[i] );
127 inputRequestedRegionStartIndex[i] =
static_cast<IndexValueType
>(
128 outputRequestedRegionStartIndex[i] * m_BloxResolution[i] );
131 typename TInputImage::RegionType inputRequestedRegion;
132 inputRequestedRegion.
SetSize( inputRequestedRegionSize );
133 inputRequestedRegion.SetIndex( inputRequestedRegionStartIndex );
135 inputPtr->SetRequestedRegion( inputRequestedRegion );
138 template<
typename TInputImage >
144 Superclass::GenerateOutputInformation();
150 if ( !inputPtr || !outputPtr )
157 const typename TInputImage::SpacingType& inputSpacing = inputPtr->GetSpacing();
158 const typename TInputImage::SizeType& inputSize = inputPtr->GetLargestPossibleRegion().GetSize();
159 const typename TInputImage::IndexType& inputStartIndex = inputPtr->GetLargestPossibleRegion().GetIndex();
163 typedef typename IndexType::IndexValueType IndexValueType;
168 for (
unsigned int i = 0; i < TOutputImage::ImageDimension; i++)
170 outputSpacing[i] = inputSpacing[i] * m_BloxResolution[i];
172 outputSize[i] =
static_cast<SizeValueType
>(
173 vcl_floor(static_cast<float>( inputSize[i] )/ m_BloxResolution[i]));
175 if( outputSize[i] < 1 )
180 outputStartIndex[i] =
static_cast<IndexValueType
>(
181 vcl_ceil(static_cast<float>( inputStartIndex[i] ) / m_BloxResolution[i] ));
184 outputPtr->SetSpacing( outputSpacing );
186 #ifdef ITK_USE_CENTERED_PIXEL_COORDINATES_CONSISTENTLY
191 for(
unsigned int j = 0; j < TOutputImage::ImageDimension; j++ )
193 inputCenterIndex[j] = inputStartIndex[j] + (inputSize[j] - 1) / 2.0;
194 outputCenterIndex[j] = outputStartIndex[j] + (outputSize[j] - 1) / 2.0;
199 inputPtr->TransformContinuousIndexToPhysicalPoint(inputCenterIndex, inputCenterPoint);
200 outputPtr->TransformContinuousIndexToPhysicalPoint(outputCenterIndex, outputCenterPoint);
203 outputOrigin = outputOrigin + (inputCenterPoint - outputCenterPoint);
204 outputPtr->SetOrigin(outputOrigin);
208 outputLargestPossibleRegion.SetSize( outputSize );
209 outputLargestPossibleRegion.SetIndex( outputStartIndex );
211 outputPtr->SetLargestPossibleRegion( outputLargestPossibleRegion );
214 template<
typename TInputImage >
219 itkDebugMacro(<<
"GradientImageToBloxBoundaryPointImageFilter::GenerateData() called");
227 outputPtr->SetBufferedRegion( outputRequestedRegion );
228 outputPtr->Allocate();
230 typename TInputImage::RegionType inputRequestedRegion = inputPtr->GetRequestedRegion();
233 ProgressReporter progress(
this, 0, inputRequestedRegion.GetNumberOfPixels());
241 TInputIterator inputIt = TInputIterator(inputPtr, inputRequestedRegion );
244 unsigned long int numBP = 0;
245 unsigned long int numBPadded = 0;
250 for ( inputIt.GoToBegin(); !inputIt.IsAtEnd(); ++inputIt)
255 for(
unsigned int i = 0; i < NDimensions; i++)
257 const double component = inputIt.Get()[i];
258 mag += component * component;
264 if( mag >= m_Threshold)
270 inputPtr->TransformIndexToPhysicalPoint( inputIt.GetIndex(), inputPosition );
273 outputPtr->TransformPhysicalPointToIndex( inputPosition, bloxIndex );
275 #ifdef ITK_USE_CENTERED_PIXEL_COORDINATES_CONSISTENTLY
277 if( outputRequestedRegion.IsInside( bloxIndex ) )
284 outputPtr->GetPixel(bloxIndex).push_back(pItem);
292 outputPtr->GetPixel(bloxIndex).push_back(pItem);
298 progress.CompletedPixel();
301 outputPtr->SetNumBoundaryPoints(numBP);
303 itkDebugMacro(<<
"Finished looking for boundary points\n"
304 <<
"I found " << numBP <<
" points\n"
305 <<
"I added " << numBPadded <<
" points\n");
308 template<
typename TInputImage >
313 Superclass::PrintSelf(os,indent);
315 os << indent <<
"Threshold level: " << m_Threshold << std::endl;