[Insight-users] Memory problem
Neil Panjwani
paniwani at gmail.com
Wed Apr 13 09:25:33 EDT 2011
I had similar memory allocation problems when running several CT slices in
32 bit. If you can, using 64-bit should solve your memory problems.
Otherwise, I think you'd have to apply your algorithm on individual chunks
at a time and combine them at the end.
On Wed, Apr 13, 2011 at 9:22 AM, Melanie Uks <meluks2010 at googlemail.com>wrote:
> I am running 32 bit.
>
>
> 2011/4/13 Neil Panjwani <paniwani at gmail.com>
>
>> Are you running in 32 or 64 bit?
>>
>> On Wed, Apr 13, 2011 at 4:47 AM, Melanie Uks <meluks2010 at googlemail.com>wrote:
>>
>>> Hi all,
>>>
>>> I tried to filter a 3D image (300x300x512) with the CannyEdgeFilter. I
>>> had the problem that I could not allocate the memory for the filtering.
>>> Anyway I don't like the CannyEdgeFilter Implementation as one has to guess
>>> which values to take for the thresholding before the gradientmagnitude image
>>> exists... Therefore I wanted to write my own edge detection routine.
>>>
>>> The steps:
>>> I generate a image (size: 300x300x512)
>>> I generate a vector image (size: 300x300x512, vector dimension:3)
>>> a) I split the image, process the imagepart with
>>> GradientRecursiveGaussianImageFilter
>>> b) I paste the processed imagepart in the vector image with the
>>> PasteImageFilter
>>> I repeat a) and b) until the whole image is processed
>>>
>>> Now the first question: Why can't I process the complete image. I have to
>>> split the image and get a result... This is the error I get:
>>> *itk::ExceptionObject (0151C728)
>>> Location: "class itk::CovariantVector<float,3> *__thiscall
>>> itk::ImportImageConta
>>> iner<unsigned long,class itk::CovariantVector<float,3>
>>> >::AllocateElements(unsig
>>> ned long) const"
>>> File:
>>> h:\itk\insighttoolkit-3.16.0\code\common\itkImportImageContainer.txx
>>> Line: 188
>>> Description: Failed to allocate memory for image.*
>>>
>>> Ok, if I accept that I have to split the image, I have a second question:
>>> I was able to run my example programm (code at the end of this mail). Then I
>>> copied the code into my actual program. It is a programm with several itk
>>> functions and Qt GUI. The only difference is that the image is saved as
>>> global variable. I was not able to run the processing. I always had the
>>> memory error. Why???
>>>
>>> Here now the code for the example processing:
>>>
>>> edgetest.cxx
>>>
>>> #include "conio.h"
>>>
>>> #include "itkImageFileWriter.h"
>>> #include "itkImageFileReader.h"
>>> #include "itkRegionOfInterestImageFilter.h"
>>> #include "itkGradientRecursiveGaussianImageFilter.h"
>>> #include "itkGradientToMagnitudeImageFilter.h"
>>> #include "itkPasteImageFilter.h"
>>> #include "itkImage.h"
>>>
>>> int main(int argc, char* argv[])
>>> {
>>> // Verify number of parameters in command line
>>> // if( argc < 3 )
>>> // {
>>> // std::cerr << "Usage: " << std::endl;
>>> // std::cerr << argv[0] << " inputImageFile outputVectorImageFile "
>>> << std::endl;
>>> // return EXIT_FAILURE;
>>> // }
>>> typedef float PixelType;
>>> typedef float ComponentType;
>>> static const unsigned int Dimension = 3;
>>> typedef itk::Image< PixelType, Dimension > ImageType;
>>> typedef itk::CovariantVector< ComponentType,
>>> Dimension > OutputPixelType;
>>> typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
>>>
>>>
>>> ImageType::Pointer image = ImageType::New();
>>>
>>> ImageType::IndexType start;
>>> for(int i = 0; i < Dimension; i++)
>>> start[i]=0;
>>>
>>> ImageType::SizeType size;
>>> size[0] = 300;
>>> size[1] = 300;
>>> size[2] = 512;
>>>
>>> ImageType::RegionType region;
>>> region.SetSize(size);
>>> region.SetIndex(start);
>>>
>>> ImageType::SpacingType spacing;
>>> spacing[0] = 20;
>>> spacing[1] = 20;
>>> spacing[2] = 4.00493;
>>>
>>> image->SetRegions(region);
>>> image->SetSpacing(spacing);
>>> image->Allocate();
>>>
>>> std::cout << region << std::endl;
>>>
>>> OutputImageType::Pointer vec_image = OutputImageType::New();
>>> OutputImageType::RegionType vecregion;
>>>
>>> OutputImageType::SizeType vecsize; //Size
>>> vecsize[0] = (image->GetLargestPossibleRegion().GetSize())[0];
>>> vecsize[1] = (image->GetLargestPossibleRegion().GetSize())[1];
>>> vecsize[2] = (image->GetLargestPossibleRegion().GetSize())[2];
>>> std::cout<<"size0: "<< vecsize[0]<< " size1: "<< vecsize[1] << " size2:
>>> " << vecsize[2] <<std::endl;
>>> vecregion.SetSize( vecsize );
>>>
>>> OutputImageType::IndexType vecstart; //Start
>>> vecstart[0] = (image->GetOrigin())[0];
>>> vecstart[1] = (image->GetOrigin())[1];
>>> vecstart[2] = (image->GetOrigin())[2];
>>> std::cout<<" start0: "<< vecstart[0]<< " start1: "<< vecstart[1] << "
>>> start2: " << vecstart[2] <<std::endl;
>>> vecregion.SetIndex( vecstart );
>>>
>>> vec_image->SetRegions(vecregion);
>>> vec_image->SetSpacing(image->GetSpacing());
>>> vec_image->Allocate();
>>>
>>> // The image buffer is initialized to a particular value
>>> OutputImageType::PixelType initialValue;
>>>
>>> // A vector can initialize all its components to the
>>> // same value by using the Fill() method.
>>> initialValue.Fill( 0.0 );
>>>
>>> // Now the image buffer can be initialized with this
>>> // vector value.
>>> vec_image->FillBuffer( initialValue );
>>> std::cout<< "Allocate" << std::endl;
>>>
>>> typedef itk::RegionOfInterestImageFilter< ImageType, ImageType >
>>> ROIFilterType;
>>> ROIFilterType::Pointer roifilter = ROIFilterType::New();
>>>
>>> // Number of Regions
>>> int splitcnt_x = 2;
>>> int splitcnt_y = 2;
>>> int overlap = 15;
>>>
>>> int stepcnt_x = (int) (size[0]*1.0/splitcnt_x + 0.5);
>>> int stepcnt_y = (int) (size[1]*1.0/splitcnt_y + 0.5);
>>>
>>>
>>> ImageType::IndexType roistart;
>>> roistart[2]=0;
>>> ImageType::SizeType roisize;
>>> roisize[2]=512;
>>> ImageType::RegionType roiregion;
>>>
>>>
>>> for (int cnt_x = 0; cnt_x < splitcnt_x; cnt_x++)
>>> {
>>> for (int cnt_y = 0; cnt_y < splitcnt_y; cnt_y++)
>>> {
>>> roistart[0]= cnt_x*stepcnt_x - overlap;
>>> roistart[1]= cnt_y*stepcnt_y - overlap;
>>> if(cnt_x == 0)
>>> {
>>> roistart[0] = 0;
>>> roisize[0] = stepcnt_x + overlap;
>>> }
>>> else
>>> {
>>> roisize[0] = stepcnt_x + 2*overlap;
>>> }
>>> if(roisize[0]+roistart[0] > size[0])
>>> {
>>> roisize[0] = size[0]-roistart[0];
>>> }
>>> if(cnt_y == 0)
>>> {
>>> roistart[1] = 0;
>>> roisize[1] = stepcnt_y + overlap;
>>> }
>>> else
>>> {
>>> roisize[1] = stepcnt_y + 2*overlap;
>>> }
>>> if(roisize[1]+roistart[1] > size[1])
>>> {
>>> roisize[1] = size[1]-roistart[1];
>>> }
>>>
>>>
>>> roiregion.SetSize(roisize);
>>> roiregion.SetIndex(roistart);
>>>
>>> std::cout << "cnt_x: " << cnt_x << " cnt_y: " << cnt_y <<
>>> std::endl;
>>>
>>> std::cout << roiregion << std::endl;
>>>
>>> std::cout << "ROI region inside image region is " <<
>>> region.IsInside(roiregion) << std::endl;
>>>
>>> roifilter->SetRegionOfInterest(roiregion);
>>> roifilter->SetInput(image);
>>>
>>> //Filter class is instantiated
>>> typedef itk::GradientRecursiveGaussianImageFilter<ImageType,
>>> OutputImageType> GradFilterType;
>>>
>>> GradFilterType::Pointer gradfilter = GradFilterType::New();
>>>
>>> //sigma is specified in millimeters
>>> gradfilter->SetSigma( 1.5 );
>>>
>>> // processing pipeline:
>>> gradfilter->SetInput(roifilter->GetOutput());
>>>
>>>
>>> typedef itk::PasteImageFilter <OutputImageType, OutputImageType >
>>> PasteImageFilterType;
>>> // The SetDestinationIndex() method prescribes where in the first
>>> // input to start pasting data from the second input.
>>> // The SetSourceRegion method prescribes the section of the
>>> second
>>> // image to paste into the first.
>>>
>>> OutputImageType::IndexType destinationIndex;
>>> destinationIndex[0] = cnt_x*stepcnt_x;
>>> destinationIndex[1] = cnt_y*stepcnt_y;
>>> destinationIndex[2] = 0;
>>>
>>> PasteImageFilterType::Pointer pasteFilter =
>>> PasteImageFilterType::New ();
>>> pasteFilter->SetSourceImage(gradfilter->GetOutput());
>>> pasteFilter->SetDestinationImage(vec_image);
>>>
>>> OutputImageType::RegionType pasteregion;
>>> OutputImageType::IndexType pastestart;
>>> pastestart[2]=0;
>>> OutputImageType::SizeType pastesize;
>>> pastesize[2]=512;
>>>
>>> pastestart[0]= overlap;
>>> pastestart[1]= overlap;
>>> pastesize[0] = stepcnt_x;
>>> pastesize[1] = stepcnt_y;
>>>
>>> if(cnt_x == 0)
>>> {
>>> pastestart[0] = 0;
>>> }
>>> if(cnt_y == 0)
>>> {
>>> pastestart[1] = 0;
>>> }
>>>
>>> pasteregion.SetIndex(pastestart);
>>> pasteregion.SetSize(pastesize);
>>>
>>> pasteFilter->SetSourceRegion(pasteregion);
>>> pasteFilter->SetDestinationIndex(destinationIndex);
>>>
>>> try
>>> {
>>> pasteFilter->Update();
>>> }
>>> catch( itk::ExceptionObject & err )
>>> {
>>> std::cerr << "ExceptionObject caught !" << std::endl;
>>> std::cerr << err << std::endl;
>>> return EXIT_SUCCESS;
>>> }
>>> }
>>> typedef itk::GradientToMagnitudeImageFilter< OutputImageType,
>>> ImageType > MagFilterType;
>>> MagFilterType::Pointer magfilter = MagFilterType::New();
>>>
>>> magfilter->SetInput(vec_image);
>>>
>>> try
>>> {
>>> magfilter->Update();
>>> image = magfilter->GetOutput();
>>> }
>>> catch( itk::ExceptionObject & err )
>>> {
>>> std::cerr << "ExceptionObject caught !" << std::endl;
>>> std::cerr << err << std::endl;
>>> return EXIT_SUCCESS;
>>> }
>>>
>>> }
>>>
>>> getch();
>>> return EXIT_SUCCESS;
>>> }
>>>
>>> _____________________________________
>>> Powered by www.kitware.com
>>>
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>>
>>> Kitware offers ITK Training Courses, for more information visit:
>>> http://www.kitware.com/products/protraining.html
>>>
>>> Please keep messages on-topic and check the ITK FAQ at:
>>> http://www.itk.org/Wiki/ITK_FAQ
>>>
>>> Follow this link to subscribe/unsubscribe:
>>> http://www.itk.org/mailman/listinfo/insight-users
>>>
>>>
>>
>
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.html
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20110413/96341323/attachment.htm>
More information about the Insight-users
mailing list