[Insight-users] 3D surface.. / Segmentation

Luis Ibanez luis . ibanez at kitware . com
Thu, 12 Jun 2003 16:59:34 -0400


Hi Yasser,

Segmenting skin from a data set can be
easily done by thresholding, as you already
verified.  This is the reason why you can
simple invoke vtMarchingCubes and get a
reasonable skin surface.

Bad news is that internal organs are not
easy to segment just by threholding.
It is then *very* unlikely that you could
succed to use vtkMarcingCubes for segmenting
any internal organ in a data set.

Segmentation is an ill-defined problem
*very very very ill-defined*.

Up to the point where there is no responsible
way to say when a segmentation is done correctly.
The best that you can do is to apply the engineering
approach of perfoming a segmentation that is 'good
enough' for your final purpose.

One of the reasons why segmentation is ill-defined
is because anatomy itself is ill-defined. For example,
when you mention "bone", do you want to include
cartilage as part of the bone tissue ? do you
consider the trabecular bone to be "bone" ?
Or when you mention "brain", do you want to include
the gray matter, the white matter and the CSF as
part of the brain. Do you want the cerebelum to be
part of the brain ?

Each one of these tissues have completely different
characteristics that are reflected in the intensity
of medical images under different modalities.

So,
start by accepting that segmentation will *never*
be perfect. There will always be sections of an organ
for which segmentation will be obscure even for
clinicians; then get an idea of 'how good' do you
need the segmentation to be for your practical
application versus how much computing time, personal
sacrifices, coffee and midnight cold pizzas are you
willing to invest for obtaining such level of  quality.

Then look for a balance point...


Among the many possible approaches for segmentation
you may want to consider the following:

(their details are described in the SoftwareGuide)
http://www . itk . org/ItkSoftwareGuide . pdf


1) Statistical classification
    Chapter 9, pdf-page 315

    That will give you a good starting point
    for segmenting Bone/Gray Matter/White Matter/CSF
    However, statistical classification doesn't use
    any spatial information. It is done purely on the
    basis of pixel intensities. For that reason you
    may want to use these techniques only for
    defining priors to other segmentation algorithms
    that use morphological and spatial information

2) Region Growing methods
    Chapter 8, pdf-page  251

    These methods are based on the assumption that
    the organ to be segmented is identified by a
    region with homogeneous intensity levels.

    The use one or more seed points provided by the
    user in order to find a set of connected pixels.

    You may want to take a look at the
    RegionGrowingSegmentation application in
    InsigthApplications.


3) Watersheds
    Section 8.2, pdf-page 262

    Again these methods assume that the organ to
    be segmented is defined as an homogeneous
    region.  This methods allows to fuse multiple
    regions in order to compose an anatomical
    structure.  You may want to take a look at the
    SegmentationEditor application in InsightApplications


4) LevelSets
    Section 8.3, pdf-page 266

    These methods represent a contour as the zero set
    of an explicit function.  The function is made evolve
    under the control of a partial differential equation.
    (representing some artificial physical model like
    anisotropic diffusion)

    Many variants of level sets behaviors are available
    in ITK, they are based on selecting different forms
    of the partial differential equation.

    If you are interested in using level sets you may
    want to start by using FastMarching (section 8.3.1)
    for generating an initial level set, and then using
    some of the other level set methods like

     - ShapeDetection
     - GeodesicActiveContours
     - ThresholdSegmentationLevelSet
     - CannySegmentationLevelSet


As you can see, there are many segmentation options
available in ITK. They simply reflect the complexity
of the Segmentation task itself.




Please let us know if you have further questions,



Regards,


   Luis



-----------------------
yasser salman wrote:
> hi saby..,
> 
> in ur skullydoo if i wanna to release the skin from 3D
> surface reconstructed, also bone..how can it comes??
> also i already construct the 3d Surface from single
> .raw format using marching
>  cube ..,and the result seems close with ur skullyDOO
> (it's a trevial reffernce for us:) thanx skullyDoo:)) 
> but i have  problem..,
> - i wanna to extracat bone and skin and brain
> indevidualy. in my case all skin and bone and brain
> constructed at the same volume   here is my code:
> 
> 
> vtkRenderer *aRenderer = vtkRenderer::New();
>   vtkRenderWindow *renWin = vtkRenderWindow::New();
>     renWin->AddRenderer(aRenderer);
>   vtkRenderWindowInteractor *iren =
> vtkRenderWindowInteractor::New();
>     iren->SetRenderWindow(renWin);
> 
> 	
> vtkImageReader *Reader = vtkImageReader::New();
>     Reader->SetFilePrefix ("D:/ImageData/t1");
>     Reader->SetFileDimensionality(3);
> 	Reader->SetFilePattern("%s%.d.raw");
>     Reader->SetDataByteOrderToBigEndian();
> 	Reader->SetDataExtent (0,180,0,216,0,180);
> 	Reader->SetDataScalarTypeToUnsignedChar();
> 	Reader->SetDataOrigin(0,0,0); 
> 	Reader->SetDataSpacing(1,1,1);
> 	Reader->SetDataMask(0x7ff);
> 	Reader->Update();
> 	
> 	vtkMarchingCubes* mc=vtkMarchingCubes::New();
> 	mc->SetInput(Reader->GetOutput());
> 	mc->SetValue(0,63);
> 
> 	mc->ComputeGradientsOff();
> 	mc->ComputeScalarsOn();
> 	mc->ComputeNormalsOn();
> 	mc->Update();
> vtkPolyDataMapper* mcmap=vtkPolyDataMapper::New();
> 	mcmap->SetInput(mc->GetOutput());
> 	mcmap->ScalarVisibilityOff();
> 	vtkActor* mcactor=vtkActor::New();
> 	mcactor->SetMapper(mcmap); 
>  mcactor->GetProperty()->SetColor(1,1,1);
> vtkCamera *aCamera = vtkCamera::New();
>     aCamera->SetViewUp (0, 0, -1);
>     aCamera->SetPosition (0, 1, 0);
>     aCamera->SetFocalPoint (0, 0, 0);
>     aCamera->ComputeViewPlaneNormal();
> aRenderer->AddActor(mcactor);
> 	aRenderer->SetActiveCamera(aCamera);
> 	 aRenderer->ResetCamera ();
> 	 aCamera->Dolly(1.5);
>     
> 	 renWin->SetSize(640, 480);
> 	iren->SetDesiredUpdateRate(3.0);
> 	iren->Initialize();
> 	iren->Start(); 
>   return 0; 
> 
> 
> 
> __________________________________
> Do you Yahoo!?
> Yahoo! Calendar - Free online calendar with sync to Outlook(TM).
> http://calendar . yahoo . com
> _______________________________________________
> Insight-users mailing list
> Insight-users at www . itk . org
> http://www . itk . org/mailman/listinfo/insight-users
>