File: itkInterpolateImagePointsFilter.txx

package info (click to toggle)
insighttoolkit 3.6.0-3
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 94,956 kB
  • ctags: 74,981
  • sloc: cpp: 355,621; ansic: 195,070; fortran: 28,713; python: 3,802; tcl: 1,996; sh: 1,175; java: 583; makefile: 415; csh: 184; perl: 175
file content (234 lines) | stat: -rw-r--r-- 7,868 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
/*=========================================================================

  Program:   Insight Segmentation & Registration Toolkit
  Module:    $RCSfile: itkInterpolateImagePointsFilter.txx,v $
  Language:  C++
  Date:      $Date: 2003-12-09 17:18:23 $
  Version:   $Revision: 1.7 $

  Copyright (c) Insight Software Consortium. All rights reserved.
  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.

  Portions of this code are covered under the VTK copyright.
  See VTKCopyright.txt or http://www.kitware.com/VTKCopyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even 
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/
#ifndef _itkInterpolateImagePointsFilter_txx
#define _itkInterpolateImagePointsFilter_txx

#include "itkInterpolateImagePointsFilter.h"
#include "itkProgressReporter.h"

namespace itk
{

/**
 * Constructor
 */
template <class TInputImage, class TOutputImage, class TCoordType, class InterpolatorType> 
InterpolateImagePointsFilter<TInputImage,TOutputImage, TCoordType, InterpolatorType>
::InterpolateImagePointsFilter()
{
  m_Interpolator = InterpolatorType::New(); 
  m_DefaultPixelValue = 0;
  
}

/**
 * Standard "PrintSelf" method
 */
template <class TInputImage, class TOutputImage, class TCoordType, class InterpolatorType> 
void 
InterpolateImagePointsFilter<TInputImage,TOutputImage, TCoordType, InterpolatorType>
::PrintSelf(
  std::ostream& os, 
  Indent indent) const
{
  Superclass::PrintSelf( os, indent );
  os << indent << "Default (background) pixel level: " << m_DefaultPixelValue << std::endl;

}



template <class TInputImage, class TOutputImage, class TCoordType, class InterpolatorType> 
void 
InterpolateImagePointsFilter<TInputImage, TOutputImage, TCoordType, InterpolatorType>
::SetInputImage (const TInputImage * inputImage)
{
  
  this->SetInput(0, inputImage); // This is a data filter input
  // ***TODO:  Where should this be done?  During the filter update?
  //  should be converted to a filter. 
  m_Interpolator->SetInputImage(inputImage);

}


template <class TInputImage, class TOutputImage, class TCoordType, class InterpolatorType> 
void 
InterpolateImagePointsFilter<TInputImage, TOutputImage, TCoordType, InterpolatorType>
::SetInterpolationCoordinate (const CoordImageType * coordinate, unsigned int setDimension)
{
  // Set each coordinate as an input.  Note that Input '0' is for the image.
  this->SetInput(setDimension+1, coordinate); // This is a data filter input

}



template <class TInputImage, class TOutputImage, class TCoordType, class InterpolatorType> 
void
InterpolateImagePointsFilter<TInputImage, TOutputImage, TCoordType, InterpolatorType>
::BeforeThreadedGenerateData()
{
  itkDebugMacro(<<"Actually Executing");

  // ***TODO: What needs to be done here? Should we set the input image at this time?
  //  ** Also, where is the output allocated?

  // OutputImagePointer outputPtr = this->GetOutput();

  // outputPtr->SetBufferedRegion( outputPtr->GetRequestedRegion() );
  // outputPtr->Allocate();


}

template <class TInputImage, class TOutputImage, class TCoordType, class InterpolatorType> 
void
InterpolateImagePointsFilter<TInputImage, TOutputImage, TCoordType, InterpolatorType>
::ThreadedGenerateData( const OutputImageRegionType& outputRegionForThread,
                        int threadId )
{
  itkDebugMacro(<<"Actually Executing");

  OutputImagePointer outputPtr = this->GetOutput();

  // There is a direct mapping between the desired outputRegion and the CoordRegion
  // coordRegion is set to outputRegionForThread.
  RegionCopierType      regionCopier;
  CoordImageRegionType coordRegion;
  regionCopier( coordRegion, outputRegionForThread );


  // Setup iterator for the output
  OutputImageIterator  outIter(outputPtr,outputRegionForThread);
  //outIter.GoToBegin();  //Not sure if this is needed or inappropriate for threading.

  // Setup an interator for each of the coordinate inputs.
  CoordImageIterator   coordIter[ImageDimension];
  for (unsigned int j = 0; j < ImageDimension; j++)
    {
    CoordImageIterator temp( this->GetInput(j+1), coordRegion );
//    temp.GoToBegin();   //Not sure if this is needed or inappropriate for threading.
    coordIter[j] = temp;
    }

  // Support for progress methods/callbacks
  ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels() );

  // Loop through each pixel and calculate interpolated value.
  ContinuousIndexType index;
  while (!outIter.IsAtEnd())
    {
    for (unsigned int j = 0; j < ImageDimension; j++)
      {
    
      index[j] = (coordIter[j]).Value();
      ++(coordIter[j]); 
      }
    if ( m_Interpolator->IsInsideBuffer(index) )
      {
      outIter.Set( m_Interpolator->EvaluateAtContinuousIndex( index ) );
      // TODO: How can we modify the code so that it could also interpolate
      //  from a set of point coordinates instead of Continuous Index coordinates?
      //  If this line is used instead of the above line then this will
      //  calculate from points. ( PointType point must replace index throughout this
      //  function.)
      // outIter.Set( m_Interpolator->Evaluate( point );
      }
    else
      {
      outIter.Set(m_DefaultPixelValue);
      }
    ++outIter;
    progress.CompletedPixel();
    }

}
/** 
 *
 */
template <class TInputImage, class TOutputImage, class TCoordType, class InterpolatorType> 
void
InterpolateImagePointsFilter<TInputImage, TOutputImage, TCoordType, InterpolatorType>
::GenerateInputRequestedRegion()
{
  // call the superclass' implementation of this method
  Superclass::GenerateInputRequestedRegion();

  if ( !this->GetInput(0) )
    {
    return;
    }

  // The coordinates may have arbitrary ordering so the entire image must be available 
  // for the filter.  The coordinates on the other hand have the default requested
  // region size.
  InputImagePointer  inputPtr = const_cast< TInputImage * > ( this->GetInput(0) );
  inputPtr->SetRequestedRegionToLargestPossibleRegion();

}


/** 
 *
 */
template <class TInputImage, class TOutputImage, class TCoordType, class InterpolatorType> 
void
InterpolateImagePointsFilter<TInputImage, TOutputImage, TCoordType, InterpolatorType>
::GenerateOutputInformation()
{
  // call the superclass' implementation of this method
  Superclass::GenerateOutputInformation();

  //   This sets the largestPossibleRegion to ensure it is the same as
  //   the coordinates.  While this should be the default behavor, given the 
  //   multiple inputs it may incorrectly default to the image largestPossibleRegion
  //   thus this method was explicitly written. 
  CoordImageTypePointer xCoordPtr = const_cast< TInputImage * > ( this->GetInput(1) );
  OutputImagePointer outputPtr = this->GetOutput();

  // we need to compute the output spacing, the output image size, and the
  // output image start index.  This is all determined by the coordinate data

  const typename TOutputImage::SpacingType& 
    outputSpacing = xCoordPtr->GetSpacing();
  const typename TOutputImage::SizeType&   outputSize
    = xCoordPtr->GetLargestPossibleRegion().GetSize();
  const typename TOutputImage::IndexType&  outputStartIndex
    = xCoordPtr->GetLargestPossibleRegion().GetIndex();

  outputPtr->SetSpacing( outputSpacing );


  typename TOutputImage::RegionType outputLargestPossibleRegion;
  outputLargestPossibleRegion.SetSize( outputSize );
  outputLargestPossibleRegion.SetIndex( outputStartIndex );

  outputPtr->SetLargestPossibleRegion( outputLargestPossibleRegion );
  //***TODO:  We have set the LargestPossibleRegion should we also set the requested 
    //  region at this stage?
    }




} // namespace itk

#endif