[Insight-users] Re: Getting started with a neighborhood operator

dave common8 at gmail.com
Fri Aug 10 11:57:38 EDT 2007


I want to calculate textural features using a small neighborhood around each
pixel, the size of which I would like to experiment with.  Right now I am
looking at the basic Haralick textural features that are computed from a
gray level cooccurrence matrix (I want to use many different offset
directions and average each texural characteristic across the offsets to get
one value for, say, the cluster shade of a particular pixel's neighbors).

The goal is to end up with a set of characteristics (feature vector) for
each pixel in the image, and then use a simple KMeans classification to
separate those pixels in the feature space into disjoint classes.

Thanks for your help

On 8/10/07, Luis Ibanez <luis.ibanez at kitware.com> wrote:
>
>
> Hi Dave,
>
> Why do you want to treat the group of pixels in the neighborhood
> as a "full image object" ?
>
> Maybe it will be helpful to start from the beginning and share
> with us a bit of background regarding what you are actually trying
> to compute from your input image.
>
> Using a neighborhood as a full-image looks like an overkill.
> Is very likely that there are better ways of implementing the
> process that you are interested on.
>
>
>    Please let us know,
>
>
>       Thanks
>
>
>         Luis
>
>
> --------------
> dave wrote:
> > Hello again
> >
> > To be more specific, I don't know how to grab the current neighborhood
> > as an image from the NeighborhoodIterator.  My code is below.  The
> > problem I am having is that the texture calculator keeps returning the
> > same feature values (energy, entropy) for all supposed neighborhoods.
> > If I use different input image files, the feature values are different,
> > so it does seem that the calculator is getting something from the file,
> > but the "block" doesn't seem to update after the first iteration.  Do I
> > need to actually take the neighborhood pixel values, one by one, and
> > place them in my temp image each time? (I'm hoping no since the reason
> > I'm using ITK is so I can have generalized code)
> >
> > Again, thanks for any help someone can provide
> >
> >
> >
> > #if defined(_MSC_VER)
> > #pragma warning ( disable : 4786 )
> > #endif
> >
> > #include "itkImageFileReader.h"
> > #include "itkNeighborhoodIterator.h"
> > #include "itkScalarImageToGreyLevelCooccurrenceMatrixGenerator.h"
> > #include "itkGreyLevelCooccurrenceMatrixTextureCoefficientsCalculator.h"
> >
> >
> > int main( int argc, char * argv [] )
> > {
> >   if( argc < 2 )
> >     {
> >     std::cerr << "Usage: " << std::endl;
> >     std::cerr << argv[0];
> >     std::cerr << " inputScalarImage" << std::endl;
> >     return EXIT_FAILURE;
> >     }
> >
> >   const char * inputImageFileName = argv[1];
> >
> >   typedef char          InputPixelType;
> >   const unsigned int    Dimension = 2;
> >
> >   typedef itk::Image<InputPixelType, Dimension > InputImageType;
> >   typedef itk::ImageFileReader< InputImageType > ReaderType;
> >   typedef itk::NeighborhoodIterator< InputImageType >
> > NeighborhoodIteratorType;
> >   typedef
> > itk::Statistics::ScalarImageToGreyLevelCooccurrenceMatrixGenerator<
> >       InputImageType> GLCMGenType;
> >   typedef
> >
> itk::Statistics::GreyLevelCooccurrenceMatrixTextureCoefficientsCalculator<
> >       GLCMGenType::HistogramType > TexCalcType;
> >
> >   //  Read input image
> >   ReaderType::Pointer reader = ReaderType::New();
> >   reader->SetFileName( inputImageFileName );
> >   try
> >     {
> >     reader->Update();
> >     }
> >   catch( itk::ExceptionObject & err )
> >     {
> >     std::cerr << "ExceptionObject caught !" << std::endl;
> >     std::cerr << err << std::endl;
> >     return EXIT_FAILURE;
> >     }
> >
> >   //  Set up neighborhood iterator and the temp output image, "block"
> >   NeighborhoodIteratorType::RadiusType radius;
> >   radius.Fill(1);
> >   NeighborhoodIteratorType it( radius, reader->GetOutput(),
> >                     reader->GetOutput()->GetRequestedRegion() );
> >   InputImageType::Pointer block = InputImageType::New();
> >   block->SetRegions( it.GetRegion());
> >   block->Allocate();
> >   block->Print( std::cout );
> >
> >   //  Set up GLCM
> >   GLCMGenType::Pointer glcm = GLCMGenType::New();
> >   glcm->SetInput( block );
> >   InputImageType::OffsetType offset = {1,1};
> >   glcm->SetOffset( offset );
> >   glcm->Compute();
> >
> >   //  Set up texture calculator
> >   GLCMGenType::HistogramType::Pointer hist = glcm->GetOutput();
> >   TexCalcType::Pointer texCalc = TexCalcType::New();
> >   texCalc->SetHistogram( hist );
> >
> >
> >   for (it.GoToBegin() ; !it.IsAtEnd(); ++it)
> >     {
> >
> >     //  Update GLCM
> >     try
> >         {
> >         glcm->Compute();
> >         }
> >     catch( itk::ExceptionObject & err )
> >         {
> >         std::cerr << "ExceptionObject caught !" << std::endl;
> >         std::cerr << err << std::endl;
> >         return EXIT_FAILURE;
> >         }
> >
> >
> >     // Calculate Textural Information from GLCM
> >     try
> >         {
> >         texCalc->Compute();
> >         }
> >     catch( itk::ExceptionObject & err )
> >         {
> >         std::cerr << "ExceptionObject caught !" << std::endl;
> >         std::cerr << err << std::endl;
> >         return EXIT_FAILURE;
> >         }
> >
> >
> >     //  Output (testing)
> >     std::cout << "Center Pixel Index = " << it.GetIndex() << std::endl;
> >     InputImageType::PixelType value = it.GetCenterPixel();
> >     std::cout << "   Center Pixel value = " << value << std::endl;
> >     std::cout << "   Energy = " << texCalc->GetEnergy() << std::endl;
> >     std::cout << "   Entropy = " << texCalc->GetEntropy() << std::endl;
> >     }
> >
> >   return EXIT_SUCCESS;
> > }
> >
> >
> >
> > On 8/6/07, dave <common8 at gmail.com <mailto:common8 at gmail.com>> wrote:
> >>  I am trying to use a neighborhood operator.  I would like to extract a
> > small (say 3x3 or 5x5) region, and then pass the output image to the
> > ScalarImageToGreyLevelCooccurr enceMatrixGenerator for textural feature
> > extraction. Then, increment the iterator and repeat the process.
> >>
> >>  Looking at the software guide and the dox, I see that the
> > NeighborhoodIterator has functions for accessing individual pixel
> > values, but how do I setup a small output image that can be updated and
> > used at each iteration? I suppose what I really want to do is just feed
> > the iterator "output image" to the GLCMGenerator but I can't seem to
> > find the correct way to do it.
> >>
> >>  Forgive me if this is something really simple, and thanks
> >>  Dave
> >>
> >>
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Insight-users mailing list
> > Insight-users at itk.org
> > http://www.itk.org/mailman/listinfo/insight-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/insight-users/attachments/20070810/3c0f53ee/attachment.htm


More information about the Insight-users mailing list