[Insight-users] characteristics

David Llanos gva02 at elai.upm.es
Mon, 26 Apr 2004 20:31:40 +0200


Hi Luis,

I proved to obtain the the coordinates of the center of gravity, and the
total mass of the object with itkImageMomentsCalculator, but I don't obtain
the wanted results. with both methods I obtain 1.
would you be so kind of revising me the code? you the enclosed thing next:
---------------------------------------------------------------------
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkImageMomentsCalculator.h"

int main( int argc, char *argv[] )
{

  typedef   unsigned char   PixelType;
  typedef   float           AccumulatorPixelType;
  const     unsigned int    Dimension = 2;
  typedef itk::Image< PixelType, Dimension >  ImageType;
  typedef  itk::ImageFileReader< ImageType > ReaderType;

  typedef itk::ImageMomentsCalculator<ImageType> caracteristicas;

  ReaderType::Pointer reader = ReaderType::New();
  reader->SetFileName( argv[1] );
  reader->Update();

  caracteristicas::Pointer imagen = caracteristicas::New();
  imagen->  SetImage ( reader->GetOutput() );


  std::cout << "Centro de gravedad: " << imagen-> GetCenterOfGravity <<
std::endl;
  std::cout << "Masa total: " << imagen->  GetTotalMass  << std::endl;
  return 0;
}
---------------------------------------------------------------------
E:\radioycdg\radio.cxx(25) : warning C4761: integral size mismatch in
argument; conversion supplied
E:\radioycdg\radio.cxx(26) : warning C4761: integral size mismatch in
argument; conversion supplied
---------------------------------------------------------------------

if I use the methods in the way GetCenterOfGravity() and GetTotalMass(),  I
don't obtain warnings, but in the execution it leaves me abnormal program
termination.

Thanks and advange and regards,

David.

----- Original Message ----- 
From: "Luis Ibanez" <luis.ibanez at kitware.com>
To: "David Llanos" <gva02 at elai.upm.es>
Cc: <insight-users at itk.org>
Sent: Friday, April 23, 2004 3:17 AM
Subject: Re: [Insight-users] characteristics


>
> Hi David,
>
> Here are two possible options.
>
>
> A) Now that you have labelled the componets
>     you could generate N binary images, each
>     one having one of the objects in the image.
>     If you feed these binary images into the
>     ImageMomentsCalculator
>
http://www.itk.org/Insight/Doxygen/html/classitk_1_1ImageMomentsCalculator.html
>
>     you will be able to easily compute the
>     coordinates of the center of gravity, and
>     the total mass of the object. Given that
>     you know the intensity of the mask, this
>     mass value is proportional to the surface
>     of the object and therefore you can use it
>     for estimating the radius. (Assuming that
>     the object is actually circular).
>
>
> B) If you feel adventurous, You could modify the
>     code of the ImageMomentsCalculator for accepting
>     an additional parameter. This parameter will be
>     a label value. Then you go to the Compute() method
>     in itkImageMomentsCalculator.txx and introduce
>     an IF statement in all the places moments are
>     being computed.  The IF should be such that only
>     the pixels with intensity equal to the label are
>     taken into account.
>
>     You will find the ImageMomentsCalculator under
>     Insight/Code/Algorithms.
>
>
>
> Note that in both cases you could use the second moments
> in order to estimate how far are the shapes from being
> circular. If you eigen-analysis the matrix of second order
> moments, the ratio of the eigen values will give you an
> estimation of excentricity, while the eigen-vectors will
> give you orientation. The ratio between second order
> moments and zero order moment will allow you to note if
> the shapes have any holes (e.g. like a ring), or
> invaginations and protrusions (e.g. like a star).
>
>
>
>     Regards,
>
>
>
>       Luis
>
>
> ---------------------
> David Llanos wrote:
>
> > hi all,
> >
> > I am looking for classes and methods to obtain characteristic of several
> > objects on a binary image, being the objects separate white parts on
> > black bottom. Of each object I want to obtain the radius and the gravity
> > center.
> > With Ivan Macia's help I believe that I have gotten the first
> > requirement for this objective that is to label this objects, by means
> > of the following code (please, indicate me you if there is some error or
> > if the one labeled is not correct):
>
> --------------------------------------------------------------------------
--------------------------------
> >                     .....
> >  xorfilter->SetInput1( grindpeak->GetOutput() );
> >  xorfilter->SetInput2( binaryDilate->GetOutput() );
> >  imgEsperBWsin->SetInput( xorfilter->GetOutput() );
> >  imgEsperBWsin->Update();
> >  std::cout << "Numero de iteraciones: " <<
> > grindpeak->GetNumberOfIterationsUsed() << "  .....bordes borrados" <<
> > std::endl;
> >     std::cout << "Imagen imgEsperBWsin.jpg creada... " << std::endl;
> >
> > // Etiquetado de la imagen
> >  itkConnectedComponentFilterType::Pointer labeller =
> >   itkConnectedComponentFilterType::New();
> >  labeller->SetInput( xorfilter->GetOutput() );
> >  labeller->Update();
> >
> >  itkRelabelComponentFilterType::Pointer relabeller =
> > itkRelabelComponentFilterType::New();
> >  relabeller->SetInput( labeller->GetOutput() );
> >  relabeller->Update();
> >
> >  // Muestra de resultados
> >  unsigned long nObjects = relabeller->GetNumberOfObjects();
> >  const std::vector<unsigned long> sizeOfObjects =
> > relabeller->GetSizeOfObjectsInPixels();
> >  std::cout << "Number of objects : " << nObjects << std::endl;
> >  std::vector<unsigned long>::const_iterator it;
> >  int i;
> >  for(i = 0, it =  sizeOfObjects.begin(); it != sizeOfObjects.end(); ++i,
> > ++it) {
> >   std::cout << "Size of object " << i+1 << ": " << (*it) << " pixels" <<
> > std::endl;
> >  }
>
> --------------------------------------------------------------------------
------------------------------------
> >
> > I now need to obtain the radius and the gravity center (two coordinates)
> > of each object, but the classes itkRelabelComponentImageFilter and
> > itkConnectedComponentImageFilter they don't have the methods for it, I
> > eat for example -> GetRadius ().
> > Do I have that instantiate "labeller" or "relabeller" with another
> > class? which advise me you that it uses?
> >
> > I attach an example image so that you see to that refer
> >
> > Thanks in advange and regards,
> >
> > David
> >
> >
> >
> >
> >
> > ------------------------------------------------------------------------
> >
>
>
>
>