[Insight-users] Extract image in a loop, I don't understand why it does not work

Atwood, Robert C r.atwood at imperial.ac.uk
Mon Jun 5 16:37:50 EDT 2006


Jim:

I take it  you mean when updating the ExtractImageFilter itself ? What
about when the filter is part of a pipeline, can you call
UpdateLargestPossibleRegion() on the end of the pipeline or do you need
to explicity call it on the ExtractImageFilter? The example I sent was
minimal to illustrate my problem, in the end I want to apply some other
filters in a pipeline. The example on p277 of the software guide does
not call this method, but the filter is part of a pipeline ... And it is
not in a loop, or used more than once! 

Is this the case for RegionOfInterestImageFilter? I tried that since
posting and it does not seem to generate such an exception for my
program. Is that just luck? Should I use UpdateLargestPossibleRegion()
in this case?


Thanks again!

Robert

-----Original Message-----
From: Jim Miller [mailto:millerjv at gmail.com] 
Sent: 05 June 2006 21:25
To: Atwood, Robert C
Cc: Insight Users
Subject: Re: [Insight-users] Extract image in a loop, I don't understand
why it does not work

Robert,

When you update the ExtractImageFilter, you should call
UpdateLargestPossibleRegion() instead of 
calling Update(). When a region is changed, there is a possibility that
the data cached in pipeline
may not be valid.  This is what the exception is reporting.  A call to
UpdateLargestPossibleRegion() 
tells the pipeline to ignore any cached region sizes.

Jim




On 6/5/06, Atwood, Robert C <r.atwood at imperial.ac.uk > wrote:

	Hi,
	I am trying to obtain the statistics for some specified regions
of an 
	image (eventualy each of several images)
	I seem to be getting an exception thrown the second time I try
to
	extract a region. Is there something that needs to be done to
reset the
	extractImagefilter?
	
	In this case I defined the pixel type to unsigned short and the
input 
	image is 1015x512. With this example the size of the region is
20x20 and
	the index starts at 0,200 and increases by 5,0 until 20,200 so
there
	should be lots of room in the image for the region.
	
	
	
	Thanks, 
	Robert
	
	*****Some output ********************
	
	...reading
	Region One: ImageRegion (0x7fbfffde70)
	  Dimension: 2
	  Index: [0, 0]
	  Size: [1015, 512]
	
	Region Two: ImageRegion (0x602118)
	  Dimension: 2
	  Index: [0, 0]
	  Size: [1015, 512]
	
	Region Three: ImageRegion (0x7fbfffde70)
	  Dimension: 2
	  Index: [0, 200]
	  Size: [20, 20]
	
	Region Four: ImageRegion (0x602118)
	  Dimension: 2 
	  Index: [0, 0]
	  Size: [1015, 512]
	
	Sample mean = [18226.6]
	Region Two: ImageRegion (0x602118)
	  Dimension: 2
	  Index: [0, 0]
	  Size: [1015, 512]
	
	Region Three: ImageRegion (0x7fbfffde70)
	  Dimension: 2
	  Index: [5, 200]
	  Size: [20, 20]
	
	Exception caught chopper update !
	
	itk::InvalidRequestedRegionError (0x614500)
	Location: "virtual void
itk::DataObject::PropagateRequestedRegion()" 
	File: /sources/local/ITK_cvs/Code/Common/itkDataObject.cxx
	Line: 397
	Description: Requested region is (at least partially) outside
the
	largest possible region.
	
	
	Region Four: ImageRegion (0x602118)
	  Dimension: 2
	  Index: [0, 0]
	  Size: [1015, 512]
	
	Sample mean = [18226.6]
	
	
	
	
	****************** The Code
*************************************
	
	#include <stdio.h>
	
	#include " itkImage.h"
	#include "itkImageFileReader.h"
	#include "itkScalarImageToListAdaptor.h"
	#include "itkScalarToArrayCastImageFilter.h"
	#include "itkMeanCalculator.h"
	#include "itkExtractImageFilter.h"
	#include "itkRegionOfInterestImageFilter.h"
	
	#ifdef T_FLOAT
	  typedef float PixelType;
	#elif defined T_BYTE
	  typedef unsigned char PixelType;
	#elif defined T_USHORT 
	  typedef unsigned short PixelType;
	#elif defined T_UINT
	  typedef u_int32_t PixelType;
	#else
	#warning NO TYPE DEFINED, defaulting to FLOAT
	  typedef float PixelType;
	#endif
	
	
	  typedef itk::Image< PixelType, 2 > ImageType; 
	
	  // definitions for writing the image
	  typedef itk::ImageFileReader<ImageType> ReaderType;
	  typedef itk::FixedArray< PixelType, 1 > MeasurementVectorType;
	  typedef itk::Image< MeasurementVectorType, 2 > ArrayImageType;

	  typedef itk::Statistics::ScalarImageToListAdaptor< ImageType >
	SampleType;
	  typedef itk::Statistics::MeanCalculator< SampleType >
	MeanAlgorithmType;
	  typedef itk::ExtractImageFilter<ImageType,ImageType>
ChopperType; 
	/*********************************/
	/* beginning of MAIN routine     */
	/*********************************/
	int main(int argc, char ** argv) {
	  int i,j;
	
	  /* ITK objects needed for processing the volume  */ 
	  ReaderType::Pointer reader = ReaderType::New();
	  ImageType::Pointer inputImage ;
	
	  ChopperType::Pointer chopper = ChopperType::New();
	  SampleType::Pointer sample = SampleType::New();
	  MeanAlgorithmType::Pointer meanAlgorithm =
MeanAlgorithmType::New(); 
	
	     ImageType::RegionType inputRegion;
	     ImageType::SizeType inputRegionSize;
	     ImageType::IndexType inputRegionIndex;
	
	  if (argc != 2){
	      printf("Little program to use itk to calculate means of
image 
	area\n");
	      printf("Usage: %s input.xxx \n",argv[0]);
	      printf("where xxx is an ITK registered file type
extension\n");
	      return(0);
	  }
	
	  /* Read in the  image */ 
	  printf("...reading\n");
	  reader->SetFileName(argv[1]);
	  inputImage=reader->GetOutput();
	  try {
	     inputImage->Update();
	  }catch( itk::ExceptionObject & exp ) {
	     std::cerr << "Exception caught inputImage update !" <<
std::endl; 
	     std::cerr << exp << std::endl;
	  }
	  inputImage->DisconnectPipeline();
	
	  /* select the specified region to get the statistics */
	  inputRegion = inputImage->GetLargestPossibleRegion (); 
	  inputRegionSize = inputRegion.GetSize ();
	  inputRegionIndex = inputRegion.GetIndex ();
	
	  /* debugging output */
	  std::cout << "Region One: " << inputRegion << std::endl;
	
	  /* loop through regions across the sample */
	  chopper->SetInput(inputImage);
	  for(i=0;i<20;i+=5){
	  std::cout << "**********************************" <<
std::endl;
	  std::cout << "* Region    " << i << "*********************" <<

	std::endl;
	  std::cout << "**********************************" <<
std::endl;
	     inputRegionIndex[0]=i;
	     inputRegionIndex[1]=200;
	     inputRegionSize[0]=20;
	     inputRegionSize[1]=20; 
	     inputRegion.SetSize (inputRegionSize);
	     inputRegion.SetIndex (inputRegionIndex);
	
	     chopper->SetExtractionRegion (inputRegion);
	
	  /* debugging output */
	     std::cout << "Region Two: " << 
	inputImage->GetLargestPossibleRegion() << std::endl;
	     std::cout << "Region Three: " << inputRegion << std::endl;
	     //std::cout << chopper << std::endl;
	
	     try {
	        chopper->Update();
	     }catch( itk::ExceptionObject & exp ) {
	        std::cerr << "Exception caught chopper update !" <<
std::endl;
	        std::cerr << exp << std::endl; 
	     }
	  /* debugging output */
	     std::cout << "Region Four: " <<
	chopper->GetInput()->GetLargestPossibleRegion() << std::endl;
	
	     /* pipe the image to the statistics package */ 
	     sample->SetImage(chopper->GetOutput());
	     //sample->SetImage(inputImage);
	     meanAlgorithm->SetInputSample( sample);
	
	     /* get the mean greylevel */
	     try {
	        meanAlgorithm->Update(); 
	     }catch( itk::ExceptionObject & exp ) {
	        std::cerr << "Exception caught subImage update !" <<
std::endl;
	        std::cerr << exp << std::endl;
	     }
	     std::cout << "Sample mean = " <<
*(meanAlgorithm->GetOutput()) << 
	std::endl;
	  }
	  printf("All done\n");
	  return (0);
	}
	
	_______________________________________________
	Insight-users mailing list
	Insight-users at itk.org 
	http://www.itk.org/mailman/listinfo/insight-users
	




More information about the Insight-users mailing list