1 /*
2  * Medical Image Registration ToolKit (MIRTK)
3  *
4  * Copyright 2008-2017 Imperial College London
5  * Copyright 2008-2013 Daniel Rueckert, Julia Schnabel
6  * Copyright 2013-2017 Andreas Schuh
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 
21 #ifndef MIRTK_GaussianBlurring_H
22 #define MIRTK_GaussianBlurring_H
23 
24 #include "mirtk/SeparableConvolution.h"
25 
26 
27 namespace mirtk {
28 
29 
30 /**
31  * Class for Gaussian blurring of images
32  *
33  * This class defines and implements the Gaussian blurring of images. The
34  * blurring is implemented by three successive 1D convolutions with a 1D
35  * Gaussian kernel.
36  *
37  * By default, if one isotropic Gaussian standard deviation is specified,
38  * the first three dimensions of the image are blurred only. Otherwise,
39  * the 1D convolution with a 1D Gaussian kernel is performed only for
40  * dimensions of more than one voxel size and for which a non-zero
41  * standard deviation for the Gaussian kernel has been set.
42  */
43 template <class TVoxel>
44 class GaussianBlurring : public SeparableConvolution<TVoxel>
45 {
46   mirtkInPlaceImageFilterMacro(GaussianBlurring, TVoxel);
47 
48 protected:
49 
50   /// Type of convolution kernels
51   typedef typename SeparableConvolution<TVoxel>::KernelType KernelType;
52 
53   /// Standard deviation of Gaussian kernel in x
54   mirtkAttributeMacro(double, SigmaX);
55 
56   /// Standard deviation of Gaussian kernel in y
57   mirtkAttributeMacro(double, SigmaY);
58 
59   /// Standard deviation of Gaussian kernel in z
60   mirtkAttributeMacro(double, SigmaZ);
61 
62   /// Standard deviation of Gaussian kernel in t
63   mirtkAttributeMacro(double, SigmaT);
64 
65 protected:
66 
67   // Base class setters unused, should not be called by user
KernelX(const KernelType *)68   virtual void KernelX(const KernelType *) {}
KernelY(const KernelType *)69   virtual void KernelY(const KernelType *) {}
KernelZ(const KernelType *)70   virtual void KernelZ(const KernelType *) {}
KernelT(const KernelType *)71   virtual void KernelT(const KernelType *) {}
72 
73   // Instantiated Gaussian kernels
74   UniquePtr<KernelType> _GaussianKernel[4];
75 
76   /// Initialize 1D Gaussian kernel with sigma given in voxel units
77   UniquePtr<KernelType> InitializeKernel(double);
78 
79   /// Initialize filter
80   virtual void Initialize();
81 
82 public:
83 
84   /// Constructor
85   GaussianBlurring(double = 1.);
86 
87   /// Constructor
88   GaussianBlurring(double, double, double = 0., double = 0.);
89 
90   /// Destructor
91   ~GaussianBlurring();
92 
93   /// Set sigma
94   virtual void SetSigma(double);
95 
96   /// Set sigma
97   virtual void SetSigma(double, double, double = 0., double = 0.);
98 
99   /// Kernel size used for a given sigma (divided by voxel size)
100   static int KernelSize(double);
101 
102 };
103 
104 
105 } // namespace mirtk
106 
107 #endif // MIRTK_GaussianBlurring_H
108