MirrorExtrapolateImageFunction.h
1 /*
2  * Medical Image Registration ToolKit (MIRTK)
3  *
4  * Copyright 2013-2015 Imperial College London
5  * Copyright 2013-2015 Andreas Schuh
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 
20 #ifndef MIRTK_MirrorExtrapolateImageFunction_H
21 #define MIRTK_MirrorExtrapolateImageFunction_H
22 
23 #include "mirtk/ExtrapolateImageFunction.h"
24 #include "mirtk/BaseImage.h"
25 
26 
27 namespace mirtk {
28 
29 
30 /**
31  * Extrapolation of generic image by mirroring along the boundaries
32  */
33 template <class TImage>
35 : public IndexExtrapolateImageFunction<TImage>
36 {
37  mirtkExtrapolatorMacro(
39  Extrapolation_Mirror
40  );
41 
42 public:
43 
44  /// Constructor
46 
47  /// Destructor
49 
50  /// Mirror index at boundary such that it is inside the range [0, max]
51  /// \note Use static function as MirrorExtrapolateImageFunction::Apply.
52  static void Apply(int &index, int max)
53  {
54  if (max == 0) {
55  index = 0;
56  } else if (index < 0) {
57  index = -index;
58  int n = index / max;
59  int m = index - n * max;
60  if (n & 1) index = max - m;
61  else index = m;
62  } else if (index > max) {
63  index -= max;
64  int n = index / max;
65  int m = index - n * max;
66  if (n & 1) index = m;
67  else index = max - m;
68  }
69  }
70 
71  /// Mirror index at boundary such that it is inside the range [0, max]
72  virtual void TransformIndex(int &index, int max) const
73  {
74  Apply(index, max);
75  }
76 
77 };
78 
79 
80 /**
81  * Extrapolation of any image by mirroring along the boundaries
82  */
84 : public GenericMirrorExtrapolateImageFunction<BaseImage>
85 {
86  mirtkObjectMacro(MirrorExtrapolateImageFunction);
87 
88 public:
89 
90  /// Constructor
92 
93  /// Destructor
95 
96 };
97 
98 
99 } // namespace mirtk
100 
101 #endif // MIRTK_MirrorExtrapolateImageFunction_H
Definition: IOConfig.h:41
virtual void TransformIndex(int &index, int max) const
Mirror index at boundary such that it is inside the range [0, max].