[Insight-users] How to access pixels of itk::Image<TPixel, Dimension>

zhao zhao_c_g at 263 . net
Fri, 9 Aug 2002 23:7:9 +0800


Hi Luis and Suzanne,

     Is there an iterator that can traverse a 3-D image in order, i.e. pixel by pixel, line by line , slice by slice? Form your directions, I know pixels of an 2-D image can be accessed in order by using ImageSliceIteratorWithIndex and its member functions SetFirstDirection and SetSecondDirection. But how to traverse a 3-D image in order? Is it unnecessary?
	Thanks a lot.

Zhao



>Hi zhao,
>
>You are completly right !
>
>The GetBufferPointer() method is NOT the appropiate
>way to access the pixels on the image.
>
>ImageIterator ARE the right mechanism for pixel access in ITK.
>
>Note that as opossed to STL-iterators, ITK image iterators
>are not obtained from the container object (in this case
>the image). STL can do this because their containers are
>all linear (so a little bit boring :-).
>
>N-D Images are far more interesting since there are many
>fun ways to walk over their pixels. ITK provides iterators
>as separate classes (not belonging to the image) in order
>to account for the variety of way to walk over an image.
>
>With this design you can always create your own way to
>walk over an image.
>
>ImageIterators are templated over the image type and
>access internally the image buffer. They encode a particular
>strategy for walking along the pixels.
>
>Here is the typical example of how to use iterator to access the
>pixels in an image:
>
>#include <itkImageRegionIterator.h>
>#include <itkImage.h>
>
>typedef itk::Image<char,4>   ImageType; // a 4-D image
>typedef itk::ImageRegionIterator< ImageType > IteratorType;
>
>ImageType::Pointer image = GetImageSomeHow();
>ImageType::ImageRegion region = image->GetLargestPossibleRegion();
>
>IteratorType  it( image, region ); // select and image+region to visit
>
>it.GoToBegin();  // move the iterator to the starting point
>while( ! it.IsAtEnd() )
>{
>  it.Set( value ); // change the value of the pixel
>  const ImageType::PixelType value = it.Get();  // get the value
>  ++it;
>}
>
>
>As in STL, all ITK iterators has their "const" version.
>This makes possible to write const-correct.
>
>
>Note that after construction the iterator contains enough
>information about the image to be able to determine how
>to start and finish its walk.  Iterators also allows to
>have basically the same code for accessing a 2D image or
>a 4D image.
>
>The full doxygenated documentation about iterators is
>available at:
>http://www.itk.org/Insight/Doxygen/html/group__ImageIterators.html
>
>Commonly used iterators are:
>
>- ImageRegionIterator : visits all pixels (no order guarranteed)
>
>- ImageLineareIteratorWithIndex: visits all pixels by going
>      along some user-specified dimension (no order among lines)
>
>- ImageSliceIteratorWithIndex:  visits all pixels by going in
>      order over two user-specified dimensions (no order among slices).
>
>Funny iterators:
>
>- RandomIterator:  walk randomly among N pixels in a region.
>
>
>Powerful iterators:
>
>NeighborhoodIterator: visits all the image by sliding a neighborhood
>   over the pixels. This great iterator solves the classical problem
>   of obtaining those 3x3x3 or 5x5x5 neighborhods for doing filtering.
>
>FloodFilledImageFunctionConditionalIterator: visit all the pixels in
>   a region that satisfy a particular criterion.  This iterator is the
>   base for severa region growing filter and connected components.
>
>
>TODO Iterators :-):
>
>PeanoIterator: an iterator that walks along a peano path so it maximizes
>   the chances of passing through a region. This is what you want to
>   explore an image in search for an object that can be anywhere on the
>   image.
>
>-------------------
>
>
>You may find interesting the page about Iterators in the
>"Concepts" section of ITK's Doxygen documentation:
>http://www.itk.org/Insight/Doxygen/html/ImageIteratorsPage.html
>
>Please let us know if you have any questions about the use
>of iterators.
>
>Thanks
>
>  Luis
>
>===================================================
>zhao wrote:
>> itkHi everyone,
>> 	I know one way of accessing the bits of itk::Image<...> is to use the 
>> ember function GetBufferPointer(). But I think a better way is to use
>iterators to access the pixels. The online document suggests that
>function Begin() be used to return an iterator. However, Begin() is not
>a member of itk::Image<...>. Is there any intermediate step I need to
>take to solve this problem??
>> 	Thanks for your reply.
>> 
>> Zhao 
>> 
>> 
>> _______________________________________________
>> Insight-users mailing list
>> Insight-users@public.kitware.com
>> http://public.kitware.com/mailman/listinfo/insight-users
>> 
>> 

Zhao ChenGuang
P.O.Box:010,
Shanghai Jiao Tong University,
1954# Hua Shan Road,
Shanghai,
P.R.China,
200030