[Insight-users] Filter running out of memory

Fabian Torres dae.wong at gmail.com
Tue Aug 20 13:45:44 EDT 2013


Hi Bradley, thank for your response. I have already check the itk module
you send me, in fact I use it as a reference to create my own, yours and
mine basically do the same. I will try to use yours in the same 3D image
and see if there is any problem similar to mine.

Thanks a lot.


On Mon, Aug 19, 2013 at 8:31 PM, Bradley Lowekamp <blowekamp at mail.nih.gov>wrote:

> Hello,
>
> I am not entirely sure what your filter is trying to do, nor what's the
> problem you are encountering.
>
> I have an itk module which has a filter to compute the GLCM for a
> neighborhood around each pixel. This may be what you are looking for, or at
> least give you some ideas on how to use the components.
>
> As it has been a while since I last used this filter, and there is a lack
> of rigorous testing, I'd recommend writing a test to verify the results for
> your usage before relaying on the output.
>
> Good luck,
> Brad
>
> [1]
> https://github.com/blowekamp/itkTextureAnalysis/blob/master/include/itkTextureFeatureImageFilter.h
>
> On Aug 19, 2013, at 8:46 PM, Fabian Torres <dae.wong at gmail.com> wrote:
>
> > Hi all. I am trying to implement a filter that gives local texture
> analysis. For this I implement a itkImagetoImageFilter that calculates
> coocurrence texture descriptor for each pixel using
> itkScalarImageToCoocurrenceMatrizFilter.
> >
> > I know this is a slow implementation, but the real problem I have is
> that when I try to use this with a 3D image, even a small one of 43x35x61,
> the computer runs out of memory. I do not know if I my implementation is
> wrong. But it seems that for each pixel I´m using a lot of memory.
> >
> > I hope someone can help me with this. Here I leave the code for the
> GenerateData() function.
> >
> > Thanks.
> >
> > this->AllocateOutputs();
> >
> >  ProgressReporter progress( this, 0,
> >        this->GetInput()->GetRequestedRegion().GetNumberOfPixels(), 100 );
> >
> >  typedef MirrorPadImageFilter<InputImageType,InputImageType>
> PadFilterType;
> >  typename PadFilterType::Pointer padFilter = PadFilterType::New();
> >
> >  int boundSize = floor(this->m_RegionSize[1]/2);
> >
> >  RegionSizeType bound;
> >  bound.Fill(boundSize);
> >
> >  padFilter->SetPadBound(bound);
> >  padFilter->SetInput(this->GetInput());
> >  padFilter->Update();
> >
> >  typename InputImageType::Pointer padImage = padFilter->GetOutput();
> >
> >  typedef
> Statistics::ScalarImageToCooccurrenceMatrixFilter<InputImageType>
> >          GLCMGeneratorType;
> >  typename GLCMGeneratorType::Pointer glcmGenerator =
> GLCMGeneratorType::New();
> >
> >  glcmGenerator->SetNumberOfBinsPerAxis(this->m_NumberofBins);
> >
>  glcmGenerator->SetPixelValueMinMax(this->m_PixelMinValue,m_PixelMaxValue);
> >
> >  typedef typename InputImageType::OffsetType OffsetType;
> >
> >  OffsetType offset1;
> >  offset1[0] = 1;
> >  offset1[1] = 0;
> >
> >  OffsetType offset2;
> >  offset2[0] = 1;
> >  offset2[1] = -1;
> >
> >  OffsetType offset3;
> >  offset3[0] = 0;
> >  offset3[1] = -1;
> >
> >  OffsetType offset4;
> >  offset4[0] = -1;
> >  offset4[1] = -1;
> >
> >  typedef typename GLCMGeneratorType::OffsetVector OffsetVectorType;
> >  typename OffsetVectorType::Pointer offsets = OffsetVectorType::New();
> >
> >  offsets->reserve(4);
> >  offsets->InsertElement(0,offset1);
> >  offsets->InsertElement(1,offset2);
> >  offsets->InsertElement(2,offset3);
> >  offsets->InsertElement(3,offset4);
> >
> >  glcmGenerator->SetOffsets(offsets);
> >
> >  typedef typename GLCMGeneratorType::HistogramType HistogramType;
> >  typedef Statistics::HistogramToTextureFeaturesFilter<HistogramType>
> >          TextureFeaturesType;
> >  typename TextureFeaturesType::Pointer textureFeatures;
> >
> >  if(this->m_TextureFeature<=8 && this->m_TextureFeature>=0){
> >      textureFeatures = TextureFeaturesType::New();
> >  }else{
> >      textureFeatures = NULL;
> >  }
> >
> >  typedef ExtractImageFilter<InputImageType,InputImageType>
> ExtractFilterType;
> >  typename ExtractFilterType::Pointer extractFilter =
> ExtractFilterType::New();
> >
> >  typename InputImageType::RegionType region;
> >  typename InputImageType::IndexType regionIndex;
> >
> >  region.SetSize(this->m_RegionSize);
> >
> >  extractFilter->SetInput(padImage);
> >
> >  ImageRegionIteratorType itPad(padImage,
> padImage->GetLargestPossibleRegion());
> >  itPad.GoToBegin();
> >
> >  ImageRegionIteratorType itOut(this->GetOutput(),
> >          this->GetOutput()->GetLargestPossibleRegion());
> >  itOut.GoToBegin();
> >
> >  while(!itPad.IsAtEnd()){
> >
> >        regionIndex = itPad.GetIndex();
> >        region.SetIndex(regionIndex);
> >
> >        if(padImage->GetLargestPossibleRegion().IsInside(region)){
> >
> >            extractFilter->SetExtractionRegion(region);
> >            extractFilter->UpdateLargestPossibleRegion();
> >
> >            glcmGenerator->SetInput(extractFilter->GetOutput());
> >            glcmGenerator->UpdateLargestPossibleRegion();
> >
> >            if(this->m_TextureFeature == 0){
> >                textureFeatures->SetInput(glcmGenerator->GetOutput());
> >                textureFeatures->UpdateLargestPossibleRegion();
> >                this->GetOutput()->SetPixel(itOut.GetIndex(),
> >
>  textureFeatures->GetFeature(TextureFeaturesType::Energy));
> >            }else if(this->m_TextureFeature == 1){
> >                textureFeatures->SetInput(glcmGenerator->GetOutput());
> >                textureFeatures->UpdateLargestPossibleRegion();
> >                this->GetOutput()->SetPixel(itOut.GetIndex(),
> >
>  textureFeatures->GetFeature(TextureFeaturesType::Entropy));
> >            }else if(this->m_TextureFeature == 2){
> >                textureFeatures->SetInput(glcmGenerator->GetOutput());
> >                textureFeatures->UpdateLargestPossibleRegion();
> >                this->GetOutput()->SetPixel(itOut.GetIndex(),
> >
>  textureFeatures->GetFeature(TextureFeaturesType::Correlation));
> >            }else if(this->m_TextureFeature == 3){
> >                textureFeatures->SetInput(glcmGenerator->GetOutput());
> >                textureFeatures->UpdateLargestPossibleRegion();
> >                this->GetOutput()->SetPixel(itOut.GetIndex(),
> >
>  textureFeatures->GetFeature(TextureFeaturesType::InverseDifferenceMoment));
> >            }else if(this->m_TextureFeature == 4){
> >                textureFeatures->SetInput(glcmGenerator->GetOutput());
> >                textureFeatures->UpdateLargestPossibleRegion();
> >                this->GetOutput()->SetPixel(itOut.GetIndex(),
> >
>  textureFeatures->GetFeature(TextureFeaturesType::Inertia));
> >            }else if(this->m_TextureFeature == 5){
> >                textureFeatures->SetInput(glcmGenerator->GetOutput());
> >                textureFeatures->UpdateLargestPossibleRegion();
> >                this->GetOutput()->SetPixel(itOut.GetIndex(),
> >
>  textureFeatures->GetFeature(TextureFeaturesType::ClusterShade));
> >            }else if(this->m_TextureFeature == 6){
> >                textureFeatures->SetInput(glcmGenerator->GetOutput());
> >                textureFeatures->UpdateLargestPossibleRegion();
> >                this->GetOutput()->SetPixel(itOut.GetIndex(),
> >
>  textureFeatures->GetFeature(TextureFeaturesType::ClusterProminence));
> >            }else if(this->m_TextureFeature == 7){
> >                textureFeatures->SetInput(glcmGenerator->GetOutput());
> >                textureFeatures->UpdateLargestPossibleRegion();
> >                this->GetOutput()->SetPixel(itOut.GetIndex(),
> >
>  textureFeatures->GetFeature(TextureFeaturesType::HaralickCorrelation));
> >            }else if(this->m_TextureFeature == 8){
> >
> >                typename HistogramType::ConstPointer hist =
> glcmGenerator->GetOutput();
> >
> >                typename HistogramType::ConstIterator it = hist->Begin();
> >
> >                float mean = 0;
> >                while(it != hist->End()){
> >                    mean += it.GetFrequency();
> >                    ++it;
> >                }
> >
> >                float nBins = hist->GetSize(0);
> >                nBins *= nBins;
> >
> >                mean /= nBins;
> >
> >                float variance = 0;
> >                it = hist->Begin();
> >                while( it != hist->End()){
> >                    variance += pow(it.GetFrequency()-mean,2);
> >                    ++it;
> >                }
> >
> >                variance /= (nBins - 1);
> >
> >                this->GetOutput()->SetPixel(itOut.GetIndex(),variance);
> >
> >                hist = NULL;
> >
> >            }
> >
> >            ++itOut;
> >
> >            progress.CompletedPixel();
> >
> >        }
> >
> >        ++itPad;
> > _____________________________________
> > 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.php
> >
> > 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
>
>


-- 
Fabián Torres Robles
Maestria en Ciencias en Ingeniería Electrónica
Ingeniería en Sistemas Electrónicos
tel. 58081280, 0445534661338
e-mail fabian.trobles at gmail.com, dae.wong at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20130820/eaca709b/attachment.htm>


More information about the Insight-users mailing list