[Insight-users] Memory problem
Melanie Uks
meluks2010 at googlemail.com
Wed Apr 13 09:33:32 EDT 2011
Sorry, I don't have that much expertice: what does "individual chunks" mean
and how to implement?
2011/4/13 Neil Panjwani <paniwani at gmail.com>
> 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/8e27b31c/attachment-0001.htm>
More information about the Insight-users
mailing list