[Insight-users] Filter running out of memory
Bradley Lowekamp
blowekamp at mail.nih.gov
Mon Aug 19 21:31:49 EDT 2013
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
More information about the Insight-users
mailing list