[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