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

Jim Miller millerjv at gmail.com
Mon Jun 5 16:24:55 EDT 2006


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/insight-users/attachments/20060605/c51d5b63/attachment-0001.htm


More information about the Insight-users mailing list