File: itkGradientImageFilterGTest.cxx

package info (click to toggle)
insighttoolkit5 5.4.3-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 704,384 kB
  • sloc: cpp: 783,592; ansic: 628,724; xml: 44,704; fortran: 34,250; python: 22,874; sh: 4,078; pascal: 2,636; lisp: 2,158; makefile: 464; yacc: 328; asm: 205; perl: 203; lex: 146; tcl: 132; javascript: 98; csh: 81
file content (117 lines) | stat: -rw-r--r-- 4,101 bytes parent folder | download
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
/*=========================================================================
 *
 *  Copyright NumFOCUS
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *         https://www.apache.org/licenses/LICENSE-2.0.txt
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *=========================================================================*/

// First include the header file to be tested:
#include "itkGradientImageFilter.h"

#include "itkDeref.h"
#include "itkImage.h"
#include "itkImageBufferRange.h"
#include "itkIndexRange.h"

#include <gtest/gtest.h>


// Tests the output for a uniform input image.
TEST(GradientImageFilter, UniformInputImage)
{
  static constexpr unsigned int Dimension{ 3 };
  using PixelType = int;
  using ImageType = itk::Image<PixelType, Dimension>;
  using ImageSizeType = itk::Size<Dimension>;
  using FilterType = itk::GradientImageFilter<ImageType>;

  for (const PixelType inputPixelValue :
       { std::numeric_limits<PixelType>::lowest(), PixelType{ 1 }, std::numeric_limits<PixelType>::max() })
  {
    const auto filter = FilterType::New();

    // Keep the image size small, in order to keep the unit test fast!
    static constexpr auto imageSize = ImageSizeType::Filled(4);

    const auto inputImage = ImageType::New();
    inputImage->SetRegions(imageSize);
    inputImage->Allocate(false);
    inputImage->FillBuffer(inputPixelValue);
    filter->SetInput(inputImage);
    filter->Update();
    const auto & output = itk::Deref(filter->GetOutput());

    const itk::ImageBufferRange outputImageBufferRange(output);

    EXPECT_EQ(outputImageBufferRange.size(), imageSize.CalculateProductOfElements());

    for (const auto & outputValue : outputImageBufferRange)
    {
      // Expect all output pixels to be zero.
      EXPECT_EQ(outputValue, FilterType::OutputPixelType{});
    }
  }
}


// Tests the output for an input image that has a constant gradient along its first dimension.
TEST(GradientImageFilter, ConstantGradientInputImage)
{
  static constexpr unsigned int Dimension{ 3 };
  using PixelType = int;
  using ImageType = itk::Image<PixelType, Dimension>;
  using IndexType = itk::Index<Dimension>;
  using SizeType = itk::Size<Dimension>;
  using FilterType = itk::GradientImageFilter<ImageType>;
  using OutputValueType = FilterType::OutputValueType;

  for (int inputGradientValue{ -1 }; inputGradientValue <= 2; ++inputGradientValue)
  {
    const auto filter = FilterType::New();

    // Keep the image size small, in order to keep the unit test fast!
    static constexpr auto imageSize = SizeType::Filled(4);

    const auto inputImage = ImageType::New();
    inputImage->SetRegions(imageSize);
    inputImage->Allocate(false);

    for (const auto & index : itk::ZeroBasedIndexRange<Dimension>(imageSize))
    {
      // A constant gradient along the first dimension of the image.
      inputImage->SetPixel(index, static_cast<PixelType>(inputGradientValue * index[0]));
    }

    filter->SetInput(inputImage);
    filter->Update();
    const auto & output = itk::Deref(filter->GetOutput());

    ASSERT_EQ(output.GetBufferedRegion().GetSize(), imageSize);

    // Only look at the inner region, to avoid boundary effects (which are beyond the scope of this unit test).
    const itk::ImageRegion innerRegion{ IndexType::Filled(1), imageSize - SizeType::Filled(2) };

    for (const auto & index : itk::ImageRegionIndexRange<Dimension>(innerRegion))
    {
      const auto outputPixelValue = output.GetPixel(index);

      EXPECT_EQ(outputPixelValue[0], inputGradientValue);

      for (unsigned int i{ 1 }; i < Dimension; ++i)
      {
        EXPECT_EQ(outputPixelValue[i], OutputValueType{ 0 });
      }
    }
  }
}