File: itkHessianRecursiveGaussianFilterScaleSpaceTest.cxx

package info (click to toggle)
insighttoolkit 3.20.1%2Bgit20120521-3
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 80,652 kB
  • sloc: cpp: 458,133; ansic: 196,223; fortran: 28,000; python: 3,839; tcl: 1,811; sh: 1,184; java: 583; makefile: 430; csh: 220; perl: 193; xml: 20
file content (131 lines) | stat: -rw-r--r-- 4,024 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*=========================================================================

  Program:   Insight Segmentation & Registration Toolkit
  Module:    itkHessianRecursiveGaussianFilterScaleSpaceTest.cxx
  Language:  C++
  Date:      $Date$
  Version:   $Revision$

  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 <itkImage.h>
#include <itkHessianRecursiveGaussianImageFilter.h>
#include <itkImageRegionIteratorWithIndex.h>

// This test creates an image varying as a 1D Gaussian in the X direction
// for different values of sigma, and checks the scale-space response of 
// the xx component of the Hessian at the center of the Gaussian.
// If NormalizeAcrossScale works correctly, the filter should yield the 
// same Hxx across different scales.

int itkHessianRecursiveGaussianFilterScaleSpaceTest(int, char* [] ) 
{
  const unsigned int Dimension = 3;
  typedef double PixelType;
  typedef itk::Image<PixelType,Dimension> ImageType;
  typedef itk::Index<Dimension> IndexType;
  typedef itk::Size<Dimension> SizeType;
  typedef itk::ImageRegion<Dimension> RegionType;
  typedef ImageType::PointType PointType;
  typedef ImageType::SpacingType SpacingType;

  ImageType::Pointer inputImage = ImageType::New();
  
  SizeType size;
  size.Fill(21);
  size[0] = 401;

  IndexType start;
  start.Fill(0);

  RegionType region;
  region.SetIndex(start);
  region.SetSize(size);

  PointType origin;
  origin.Fill(-1.25);
  origin[0] = -20.0;

  SpacingType spacing;
  spacing.Fill(0.1);

  inputImage->SetOrigin(origin);
  inputImage->SetSpacing(spacing);

  inputImage->SetLargestPossibleRegion(region);
  inputImage->SetBufferedRegion(region);
  inputImage->SetRequestedRegion(region);
  inputImage->Allocate();

  typedef itk::ImageRegionIteratorWithIndex<ImageType> IteratorType;

  const unsigned int numberOfScales = 4;
  double scales[numberOfScales];
  scales[0] = 1.0;
  scales[1] = 2.0;
  scales[2] = 3.0;
  scales[3] = 5.0;

  for (unsigned int i=0; i<numberOfScales; i++)
    {
    IteratorType it(inputImage, inputImage->GetRequestedRegion());
  
    PointType point;
    double objectSize = scales[i];

    // Fill the image with a 1D Gaussian along X with sigma equal to the current scale
    // The Gaussian is not normalized, since it should have the same peak value across
    // scales, only sigma should change
    while(!it.IsAtEnd()) 
      {
      inputImage->TransformIndexToPhysicalPoint(it.GetIndex(),point);
      double value = vcl_exp(-point[0]*point[0] / (2.0*objectSize*objectSize));
      it.Set(value);
      ++it;
      }

    // Compute the hessian using NormalizeAcrossScale true
    typedef itk::HessianRecursiveGaussianImageFilter<ImageType> FilterType;
              
    typedef FilterType::OutputImageType HessianImageType;

    FilterType::Pointer filter = FilterType::New();
    filter->SetInput(inputImage); 
    filter->SetSigma(objectSize); 
    filter->SetNormalizeAcrossScale(true);
    filter->Update();

    HessianImageType::Pointer outputImage = filter->GetOutput();

    // Get the value at the center of the image, the location of the peak of the Gaussian
    PointType center;
    center.Fill(0.0);
    
    IndexType centerIndex;

    typedef HessianImageType::PixelType HessianType;

    outputImage->TransformPhysicalPointToIndex(center,centerIndex);

    // Irrespective of the scale, the Hxx component should be the same 
    double centerHxx = outputImage->GetPixel(centerIndex)[0];

    if (centerHxx > -35.46 || centerHxx < -35.47)
      {
      return EXIT_FAILURE;
      }
    }

  return EXIT_SUCCESS;
}