[Insight-users] watershed with MRI

Joshua Cates cates@sci.utah.edu
Wed, 8 Jan 2003 11:54:35 -0700 (MST)


Hi Lydia,

For your MRI image, make sure that you cast to float (or double) before 
passing to the GradientMagnitudeImageFilter.  You might also want to do 
some smoothing on the image first (i.e. 
Gradient/CurvatureAnisotropicDiffusionImageFilter or 
BilateralImageFilter). 

In your example code below, you set the Level parameter to 1.0.  This 
should result in an output of exactly one region because it is telling the 
filter to merge all of the potential watershed basins up to 100% of the 
possible image height.  Try a Level parameter much lower than this, say 
0.10 (i.e. 10% of the height).

Josh.

______________________________
 Josh Cates			
 School of Computer Science	
 University of Utah
 Email: cates@sci.utah.edu
 Phone: (801) 587-7697
 URL:   http://www.sci.utah.edu/~cates


On Wed, 8 Jan 2003, lydia coin wrote:

> 
> thank you for your hints.
> 
> That what I did,  I used an MRI image, with the GradientMagnitudeImageFilter and pass it to the watershed filter. the result is an image with the same intensity value.
> 
> In addition to using MRI image, I took the image of the testing example as follows (source code below). The result is an image with the same intensity value everywhere in the image ( like for the MRI). In this case the pixel type is float but still doesn't work. I'll cast the MR image to float but in the meanwhile, could you have a look to my code, maybe something is wrong.  
> 
>  
> 
> typedef itk::Image<float, 2> ImageType2D;
>   itk::ImageRegion<2> Region2D;
>   itk::Size<2>  size2D;
>    size2D[0] = 256;
>    size2D[1] = 256;
>   itk::Index<2> orig2D;
>    orig2D[0] = 0;
>    orig2D[1] = 0;
> 
>   Region2D.SetSize(size2D);
>   Region2D.SetIndex(orig2D);
> 
>   ImageType2D::Pointer image2D = ImageType2D::New();
>    image2D->SetLargestPossibleRegion(Region2D);
>    image2D->SetBufferedRegion(Region2D);
>    image2D->SetRequestedRegion(Region2D);
>    image2D->Allocate();
> 
> 
> itk::ImageRegionIterator<ImageType2D>
>      it2D(image2D, image2D->GetRequestedRegion());  
>   
>   float q = 0.00f;
>   for (; !it2D.IsAtEnd(); ++it2D)
>     {
>       it2D.Value() = ::sin(q);
>       q = q + 0.10f;
>     }
> 
>   float lower_threshold=.05f;
> itk::WatershedImageFilter<ImageType2D>::Pointer watershed
>     = itk::WatershedImageFilter<ImageType2D>::New();
>   watershed->SetThreshold(lower_threshold);
>   watershed->SetLevel(1.0f);
>   watershed->SetInput(image2D);
> typedef unsigned long PixelType1;
>  PixelType1  *data = new PixelType1[size[0]*size[1]];
>   typedef itk::ImageRegionIterator<TestInputImage>ImageIterator1;
>     ImageIterator1  it1(watershed->GetOutput(),watershed->GetOutput()->GetBufferedRegion());
>  it1.GoToBegin();
>    int i=0;
>   while( !it1.IsAtEnd() )
>   {
>     data[i]=it1.Get( );
>     ++it1;
>  i++;
>   }
> 
> 
> 
> ---------------------------------
> Do You Yahoo!? -- Une adresse @yahoo.fr gratuite et en français !
> Testez le nouveau Yahoo! Mail