ITK/Examples/ImageProcessing/BinaryFunctorImageFilterCustom

From KitwarePublic
< ITK‎ | Examples
Revision as of 19:29, 23 February 2011 by Daviddoria (talk | contribs) (Created page with "This example computes the squared difference between corresponding pixels. Note: This functionality is already available in SquaredDifferenceImageFilter. We simply use this as a ...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

This example computes the squared difference between corresponding pixels. Note: This functionality is already available in SquaredDifferenceImageFilter. We simply use this as a simple operation to demonstrate the BinaryFunctorImageFilter.


BinaryFunctorImageFilter.cxx

<source lang="cpp">

  1. include "itkVectorImage.h"
  2. include "itkVector.h"
  3. include "itkVariableLengthVector.h"
  4. include "itkRigid2DTransform.h"
  5. include "itkBinaryFunctorImageFilter.h"

typedef itk::Image<float, 2> ImageType; static void CreateImage(ImageType::Pointer image);

namespace Functor { template< class TPixel> class MySquaredDifference { public:

 MySquaredDifference() {}
 ~MySquaredDifference() {}
 bool operator!=(const MySquaredDifference &) const
 {
   return false;
 }
 bool operator==(const MySquaredDifference & other) const
 {
   return !( *this != other );
 }
 inline TPixel operator()(const TPixel & A,
                           const TPixel & B) const
 {
   const double dA = static_cast< double >( A );
   const double dB = static_cast< double >( B );
   const double diff = dA - dB;
   return static_cast< TPixel >( diff * diff );
 }

}; }

int main(int, char *[]) {

 ImageType::Pointer image1 = ImageType::New();
 CreateImage(image1);
 image1->FillBuffer(2);
 ImageType::Pointer image2 = ImageType::New();
 CreateImage(image2);
 image2->FillBuffer(5);
 
 typedef itk::BinaryFunctorImageFilter< ImageType, ImageType, ImageType,
                           Functor::MySquaredDifference<ImageType::PixelType> > FilterType;
 FilterType::Pointer filter = FilterType::New();
 filter->SetInput1(image1);
 filter->SetInput2(image2);
 filter->Update();
 itk::Index<2> pixelIndex;
 pixelIndex.Fill(0);
 
 ImageType::PixelType input1PixelValue = image1->GetPixel(pixelIndex);
 ImageType::PixelType input2PixelValue = image2->GetPixel(pixelIndex);
 ImageType::PixelType outputPixelValue = filter->GetOutput()->GetPixel(pixelIndex);
 std::cout << "pixel1 was = " << input1PixelValue << std::endl;
 std::cout << "pixel2 was = " << input2PixelValue << std::endl;
 std::cout << "output is = " << outputPixelValue << std::endl;
 return EXIT_SUCCESS;

}

void CreateImage(ImageType::Pointer image) {

 ImageType::IndexType start;
 start.Fill(0);
 
 ImageType::SizeType size;
 size.Fill(10);
 ImageType::RegionType region(start,size);
 image->SetRegions(region);
 image->Allocate();

} </source>

CMakeLists.txt

<source lang="cmake"> cmake_minimum_required(VERSION 2.6)

PROJECT(BinaryFunctorImageFilter)

FIND_PACKAGE(ITK REQUIRED) INCLUDE(${ITK_USE_FILE})

ADD_EXECUTABLE(BinaryFunctorImageFilter BinaryFunctorImageFilter.cxx) TARGET_LINK_LIBRARIES(BinaryFunctorImageFilter ITKIO ITKBasicFilters ITKCommon )

</source>