[Insight-users] bug in itkBinaryErodeImageFilter

Albert Huang alberth+itk at ece.ubc.ca
Fri Jun 24 20:19:40 EDT 2005


Hi Kingaza,

The problem is that there's a default behavior
that needs to be changed for boundary condition.
You need to add the itk::ConstantBoundaryCondition
(like at the end of my erosion code sample below).
I set mine to be 0 at boundaries. Same goes for
dilation.
---------------------------------------------------------------------
 typedef itk::BinaryBallStructuringElement<Type08,DIM>
StructuringElementType;
 StructuringElementType structuringElement;
 structuringElement.SetRadius( 1 ); // 3x3 structuring element
 structuringElement.CreateStructuringElement();

 typedef
itk::BinaryErodeImageFilter<Image3DType08,Image3DType08,StructuringElementTy
pe> ErodeFilterType;
 ErodeFilterType::Pointer erode_bin;
 erode_bin = ErodeFilterType::New();
 erode_bin->SetKernel( structuringElement );
 erode_bin->SetErodeValue( 1 );

 typedef itk::ConstantBoundaryCondition<Image3DType08>
BoundaryConditionType;
 BoundaryConditionType erode_bin_bc;
 erode_bin_bc.SetConstant(0);

 erode_bin->OverrideBoundaryCondition(&erode_bin_bc);
--------------------------------------------------------------

Hope this helps. Cheers,
--------------------------------------------------
Albert Huang, S.M. in Engineering Science
http://www.ece.ubc.ca/~alberth/
University of British Columbia,
Biomedical Image & Signal Computing Lab
x421-2366 Main Mall (ICICS), Vancouver
British Columbia, V6T1Z4, Canada
Tel: 604-82-28851 (ext)

> Date: Wed, 22 Jun 2005 21:16:03 +0800
> From: <kingaza at gmail.com>
> Subject: Re: [Insight-users] bug in itkBinaryErodeImageFilter
> To: Gaetan Lehmann <gaetan.lehmann at jouy.inra.fr>
> Cc: insight-users at itk.org
> Message-ID: <e68441020506220616578524f3 at mail.gmail.com>
> Content-Type: text/plain; charset="iso-8859-1"
>
> Hi Gaetan and all
> no, i just try the test
>
> On 6/22/05, Gaetan Lehmann <gaetan.lehmann at jouy.inra.fr> wrote:
> >
> > Hi,
> >
> > I have a similar problem some weeks ago. I have forgotten to use
> > CreateStructuringElement() method on kernel object.
> > Perhap's it's the same for you ?
> >
> > Regards,
> >
> > Gaetan.
> >
> > On Wednesday 22 June 2005 02:43, kingaza at gmail.com wrote:
> > > Hi all,
> > >
> > > I choose a  kernel with the size of [1,1], and set ErodeValue as 0
> > >
> > >   0  0  0  0  0  0                             0  0  0  0  0  0
> > >   0  0  0  0  0  0                             0  0  0  0  0  0
> > >   0  0  0  0  0  0                             0  0  0  0  0  0
> > >   0  0  0  1  1  1                             0  0  0  0  0  0
> > >   0  0  0  1  1  1       =====>          0  0  0  0  1  65535
> > >   0  0  0  1  1  1                             0  0  0  0  0  0
> > >   0  0  0  0  0  0                             0  0  0  0  0  0
> > >   0  0  0  0  0  0                             0  0  0  0  0  0
> > >   0  0  0  0  0  0                             0  0  0  0  0  0
> -- 
> Regards,
> Kingaza
> -------------- next part --------------
>
/*=========================================================================
>
>   Program:   Insight Segmentation & Registration Toolkit
>   Module:    $RCSfile: itkBinaryErodeImageFilterTest.cxx,v $
>   Language:  C++
>   Date:      $Date: 2003/09/10 14:30:05 $
>   Version:   $Revision: 1.4 $
>
>   Copyright (c) Insight Software Consortium. All rights reserved.
>   See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for
details.
>
>      This software is distributed WITHOUT ANY WARRANTY; without even
>      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
>      PURPOSE.  See the above copyright notices for more information.
>
>
=========================================================================*/
> #if defined(_MSC_VER)
> #pragma warning ( disable : 4786 )
> #endif
>
>
> #include <stdlib.h>
> #include <itkImage.h>
> #include <itkBinaryErodeImageFilter.h>
> #include <itkBinaryBallStructuringElement.h>
> #include <itkImageRegionIterator.h>
> #include <itkExceptionObject.h>
>
> int main(int, char* [] )
> {
>   unsigned int i;
>
>   // Define the dimension of the images
>   const unsigned int myDimension = 2;
>
>   // Define the values of the input images
>   const unsigned short fgValue = 1;
>   const unsigned short bgValue = 0;
>
>   // Declare the types of the images
>   typedef itk::Image<unsigned short, myDimension>  myImageType;
>
>   // Declare the type of the index to access images
>   typedef itk::Index<myDimension>         myIndexType;
>
>   // Declare the type of the size
>   typedef itk::Size<myDimension>          mySizeType;
>
>   // Declare the type of the Region
>   typedef itk::ImageRegion<myDimension>        myRegionType;
>
>   // Create an image
>   myImageType::Pointer inputImage  = myImageType::New();
>
>   // Define their size, and start index
>   mySizeType size;
>   size[0] = 20;
>   size[1] = 20;
>
>   myIndexType start;
>   start[0] = 0;
>   start[1] = 0;
>
>   myRegionType region;
>   region.SetIndex( start );
>   region.SetSize( size );
>
>   // Initialize Image
>   inputImage->SetRegions( region );
>   inputImage->Allocate();
>
>   // Declare Iterator types apropriated for each image
>   typedef itk::ImageRegionIterator<myImageType>  myIteratorType;
>
>   // Create one iterator for image (this is a light object)
>   myIteratorType it( inputImage, inputImage->GetBufferedRegion() );
>
>   // Initialize the content of Image
>   std::cout << "Input image " << std::endl;
>   inputImage->FillBuffer(bgValue);
>
>   myImageType::IndexType ind;
>   ind[0] = 10;
>   ind[1] = 10;
>   inputImage->SetPixel(ind, fgValue);
>
>   ind[0] = 10;
>   ind[1] = 11;
>   inputImage->SetPixel(ind, fgValue);
>
>   ind[0] = 10;
>   ind[1] = 9;
>   inputImage->SetPixel(ind, fgValue);
>
>   ind[0] = 11;
>   ind[1] = 10;
>   inputImage->SetPixel(ind, fgValue);
>
>   ind[0] = 11;
>   ind[1] = 11;
>   inputImage->SetPixel(ind, fgValue);
>
>   ind[0] = 10;
>   ind[1] = 12;
>   inputImage->SetPixel(ind, fgValue);
>   ind[0] = 11;
>   ind[1] = 12;
>   inputImage->SetPixel(ind, fgValue);
>   ind[0] = 12;
>   ind[1] = 10;
>   inputImage->SetPixel(ind, fgValue);
>   ind[0] = 12;
>   ind[1] = 11;
>   inputImage->SetPixel(ind, fgValue);
>   ind[0] = 12;
>   ind[1] = 12;
>   inputImage->SetPixel(ind, fgValue);
>   ind[0] = 2;
>   ind[1] = 2;
>   inputImage->SetPixel(ind, fgValue);
>
>   ind[0] = 19;
>   ind[1] = 10;
>   inputImage->SetPixel(ind, fgValue);
>
>   ind[0] = 19;
>   ind[1] = 11;
>   inputImage->SetPixel(ind, fgValue);
>
>   ind[0] = 19;
>   ind[1] = 12;
>   inputImage->SetPixel(ind, fgValue);
>
>   ind[0] = 18;
>   ind[1] = 10;
>   inputImage->SetPixel(ind, fgValue);
>
>   ind[0] = 18;
>   ind[1] = 11;
>   inputImage->SetPixel(ind, fgValue);
>
>   ind[0] = 18;
>   ind[1] = 12;
>   inputImage->SetPixel(ind, fgValue);
>
>   ind[0] = 17;
>   ind[1] = 10;
>   inputImage->SetPixel(ind, fgValue);
>   ind[0] = 17;
>   ind[1] = 11;
>   inputImage->SetPixel(ind, fgValue);
>
>   ind[0] = 17;
>   ind[1] = 12;
>   inputImage->SetPixel(ind, fgValue);
>
>   ind[0] = 0;
>   ind[1] = 19;
>   inputImage->SetPixel(ind, fgValue);
>
>   i = 0;
>   it.GoToBegin();
>   while ( !it.IsAtEnd() )
>     {
>     std::cout << it.Get() << "  ";
>     ++it;
>
>     if (++i % 20 == 0)
>       {
>       std::cout << std::endl;
>       }
>     }
>
>   // Declare the type for the structuring element
>   typedef itk::BinaryBallStructuringElement<unsigned short, myDimension>
>     myKernelType;
>
>   // Declare the type for the morphology Filter
>   typedef itk::BinaryErodeImageFilter<myImageType, myImageType,
myKernelType>
>     myFilterType;
>
>   // Create the filter
>   myFilterType::Pointer filter = myFilterType::New();
>
>   // Create the structuring element
>   myKernelType ball;
>   myKernelType::SizeType ballSize;
>   ballSize[0] = 1;
>   ballSize[1] = 1;//4;
>   ball.SetRadius(ballSize);
>   ball.CreateStructuringElement();
>
>   // Connect the input image
>   filter->SetInput( inputImage );
>   filter->SetKernel( ball );
>   filter->SetErodeValue( fgValue );
>
>   // Get the Smart Pointer to the Filter Output
>   myImageType::Pointer outputImage = filter->GetOutput();
>
>
>   // Test the itkGetMacro
>   unsigned short value = filter->GetErodeValue();
>   std::cout << "filter->GetErodeValue(): " << value << std::endl;
>
>   // Execute the filter
>   try
>     {
>
>     filter->Update();
>     // Create an iterator for going through the image output
>     myIteratorType it2(outputImage, outputImage->GetBufferedRegion());
>
>     //  Print the content of the result image
>     std::cout << "Result " << std::endl;
>     i=0;
>     while( !it2.IsAtEnd() )
>       {
>       std::cout << it2.Get() << "  ";
>       ++it2;
>
>       if (++i % 20 == 0)
>         {
>         std::cout << std::endl;
>         }
>       }
>    }
>
>   catch (itk::ExceptionObject& e)
>     {
>     std::cerr << "Exception caught during filter Update\n"  << e;
>     return -1;
>     }
>
>   // All objects should be automatically destroyed at this point
>
>   return 0;
>
> }



More information about the Insight-users mailing list