[Insight-users] MultiResolution Registration
Bing Jian
bjian at cise . ufl . edu
Tue, 11 Nov 2003 11:57:38 -0500 (EST)
Hi Luis,
Thanks for your reply.
I am doing deformable registration using multiresolution.
The local deformation field at each level is measured between
PhysicalPoints of fixedImagePyramid and movingImagePyramid.
So when I use the deformation field obtained from coarser
level as initial guess of next finer level, I do not need
to scale the deformation field before interpolation, right?
--
Best wishes,
Bing Jian
bjian at cise . ufl . edu
On Mon, 10 Nov 2003, Luis Ibanez wrote:
> Hi Bing,
>
> The Multi-Resolution framework actually creates
> a pyramid of images, where each level is a shrinked
> version of the original image.
>
> The subsampling process is done by the MultiResolution
> Pyramid class
> http://www . itk . org/Insight/Doxygen/html/classitk_1_1RecursiveMultiResolutionPyramidImageFilter . html
>
> The pyramid structure is smoothing the data using a
> RecursiveGaussianImageFilter and then subsampling
> by the factor that you specified.
>
> [ Subsampling must always be preceeded by smoothing
> in order to avoid aliasing effect resulting from
> the overlap of the spectra in the frequency domain. ]
>
>
> Of course, if your subsampling factor is 2, the
> region size of the resulting level will have
> half the size (measured in number of pixels) than
> the previous level. NOTE however that the spacing
> will also be doubled, so the total physical extent
> of the image measured in millimeters will still
> be the same in both levels.
>
>
> If you have a pyramid with two levels and the
> scaling factor between them is 2, then when you
> read the pixel value at index (0,1) in the coarser
> level, this position will be equivalent to index
> (0,2) in the finer level.
>
> If you want to verify this experimentally, simply
> connect an ImageFileWriter to every level of the
> pyramid and save the different levels to MetaImage
> format.
>
> Upon inspection of these files you should find that
> the spacing on each level increases as they go to
> the top of the pyramid while the region size decreases.
>
> Use the ImageViewer application in InsightApplication
> in order to view these images. You will be able to
> click and probe homologous pixels (by opening two
> viewers simultaneously, each one with one level of the
> pyramid). The coordingates printed out on the lower
> right corner of the viewer will show you the positions
> in millimiters.
>
>
> Please let us know if you have further questions.
>
>
> Thanks
>
>
> Luis
>
>
> -------------------
> Bing Jian wrote:
> > Hi, Luis,
> >
> > Following code snippet is copied from
> > itkMultiResolutionImageRegistrationMethod.txx
> >
> > I'm wondering if it does shrink the orginal image.
> > For me, it seems just cutting the size of original
> > region. For example, if scaleFactor is 2, start=[0,0],
> > size = [w,h], then the new region will starts from
> > [0,0] and ends at [w/2, h/2]. But where is the job
> > done to filter out those pixels at unused grid points?
> >
> > If I set an iterator (named it) with the orginal image
> > and this new cutted region, after one ++it operation,
> > what's the data returned by it.Get(). Is it the pixel value
> > at original index (0,1) or original index (0,2)? and when
> > it.AtEnd(), the data is value at (w,h) or (w/2, h/2)?
> >
> > Hope it's clear.
> >
> > Thanks in advance!
> >
> > // Compute the FixedImageRegion corresponding to each level of the
> > // pyramid. This uses the same algorithm of the ShrinkImageFilter
> > // since the regions should be compatible.
> > for ( unsigned int level=0; level < m_NumberOfLevels; level++ )
> > {
> > SizeType size;
> > IndexType start;
> > for ( unsigned int dim = 0; dim < TFixedImage::ImageDimension;
> > dim++)
> > {
> > const float scaleFactor = static_cast<float>( schedule[ level ][
> > dim ] );
> >
> > size[ dim ] = static_cast<typename SizeType::SizeValueType>(
> > floor( static_cast<float>( inputSize[ dim ] ) / scaleFactor )
> > );
> > if( size[ dim ] < 1 )
> > {
> > size[ dim ] = 1;
> > }
> >
> > start[ dim ] = static_cast<typename IndexType::IndexValueType>(
> > ceil( static_cast<float>( inputStart[ dim ] ) / scaleFactor )
> > );
> > }
> > m_FixedImageRegionPyramid[ level ].SetSize( size );
> > m_FixedImageRegionPyramid[ level ].SetIndex( start );
> > }
> >
>
>
>
>
>