source: trunk/src/Utils/GaussSmooth2D.hh @ 1213

Last change on this file since 1213 was 1187, checked in by MatthewWhiting, 11 years ago

Some major changes to the 2D smoothing. Fixing the normalisation of the kernel, so that the fluxes do the right thing in the smoothed array (ie. don't go up). Also moving to size_t types for a lot of the indexing variables. Finally, improving the memory management of the arrays in the function that calls the smoother.

File size: 4.1 KB
Line 
1// -----------------------------------------------------------------------
2// GaussSmooth2D.hh: Definition of GaussSmooth2D class, used to smooth a
3//                 2D image with a Gaussian kernel.
4// -----------------------------------------------------------------------
5// Copyright (C) 2006, Matthew Whiting, ATNF
6//
7// This program is free software; you can redistribute it and/or modify it
8// under the terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 2 of the License, or (at your
10// option) any later version.
11//
12// Duchamp is distributed in the hope that it will be useful, but WITHOUT
13// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15// for more details.
16//
17// You should have received a copy of the GNU General Public License
18// along with Duchamp; if not, write to the Free Software Foundation,
19// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
20//
21// Correspondence concerning Duchamp may be directed to:
22//    Internet email: Matthew.Whiting [at] atnf.csiro.au
23//    Postal address: Dr. Matthew Whiting
24//                    Australia Telescope National Facility, CSIRO
25//                    PO Box 76
26//                    Epping NSW 1710
27//                    AUSTRALIA
28// -----------------------------------------------------------------------
29#ifndef GAUSSSMOOTH2D_H
30#define GAUSSSMOOTH2D_H
31#include <duchamp/duchamp.hh>
32
33/// @brief How the edges of the array are dealt with
34enum EDGES { EQUALTOEDGE,       ///< All pixels are used and treated equally
35             SCALEBYCOVERAGE,   ///< All pixels are used, but edge pixels are weighted down by the kernel coverage
36             TRUNCATE           ///< Pixels at edge are set to Blank.
37};
38
39/// @brief
40///  Define a Gaussian to smooth a 2D array.
41/// @details
42///  A simple class to define a Gaussian kernel that can be used to
43///  smooth a two-dimensional array.
44
45template <class Type>
46class GaussSmooth2D
47{
48public:
49  GaussSmooth2D();          ///< Basic constructor: no kernel defined.
50  virtual ~GaussSmooth2D(); ///< Destructor
51  GaussSmooth2D(const GaussSmooth2D& g);
52  GaussSmooth2D& operator=(const GaussSmooth2D& g);
53 
54  void defaults();
55
56  /// @brief Specific constructor that sets up kernel.
57  GaussSmooth2D(float maj, float min, float pa); 
58  /// @brief Specific constructor that sets up kernel: assuming circular gaussian.
59  GaussSmooth2D(float maj); 
60
61  /// @brief Define the size and the array of coefficients.
62  void   define(float maj, float min, float pa);
63
64  /// @brief Set the size of the kernel
65  void   setKernelWidth(float width){kernWidth = width;};
66
67  /// @brief Smooth an array with the Gaussian kernel
68  Type *smooth(Type *input, size_t xdim, size_t ydim, EDGES edgeTreatment=EQUALTOEDGE); 
69  /// @brief Smooth an array with the Gaussian kernel, using a mask to define blank pixels
70  Type *smooth(Type *input, size_t xdim, size_t ydim, bool *mask, EDGES edgeTreatment=EQUALTOEDGE); 
71 
72  void   setKernMaj(float f){kernMaj=f;};
73  void   setKernMin(float f){kernMin=f;};
74  void   setKernPA(float f){kernPA=f;};
75 
76  Type   getKernelPt(int i){return kernel[i];};
77  Type  *getKernel(){return kernel;};
78
79  int    getKernelWidth(){return kernWidth;};
80  float  getStddevScale(){return stddevScale;};
81
82  void   setBlankVal(Type b){blankVal = b;};
83  Type   getBlankVal(){return blankVal;};
84
85    bool isAllocated(){return allocated;};
86
87private:
88  float  kernMaj;      ///< The FWHM of the major axis of the elliptical Gaussian.
89  float  kernMin;      ///< The FWHM of the minor axis of the elliptical Gaussian.
90  float  kernPA;       ///< The position angle of the elliptical Gaussian.
91  size_t kernWidth;    ///< The width of the kernel (in pixels).
92  float  stddevScale;  ///< The factor by which the rms of the input array gets scaled by (assuming iid normally)
93  Type  *kernel;       ///< The coefficients of the smoothing kernel
94  bool   allocated;    ///< Have the coefficients been allocated in memory?
95  Type   blankVal;     ///< What value to set blanks (when doing TRUNCATE mode)
96
97};
98
99#include <duchamp/Utils/GaussSmooth2D.tcc>
100
101#endif  // GAUSSSMOOTH2D_H
102 
Note: See TracBrowser for help on using the repository browser.