[Insight-users] Memory problem
Melanie Uks
meluks2010 at googlemail.com
Wed Apr 13 09:22:31 EDT 2011
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
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20110413/9b7e97bb/attachment.htm>
More information about the Insight-users
mailing list