Loading [MathJax]/extensions/tex2jax.js
LSSTApplications  18.1.0
LSSTDataManagementBasePackage
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
estimateBackground.py
1 #!/usr/bin/env python
2 
3 #
4 # This file is part of afw.
5 #
6 # Developed for the LSST Data Management System.
7 # This product includes software developed by the LSST Project
8 # (https://www.lsst.org).
9 # See the COPYRIGHT file at the top-level directory of this distribution
10 # for details of code ownership.
11 #
12 # This program is free software: you can redistribute it and/or modify
13 # it under the terms of the GNU General Public License as published by
14 # the Free Software Foundation, either version 3 of the License, or
15 # (at your option) any later version.
16 #
17 # This program is distributed in the hope that it will be useful,
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 # GNU General Public License for more details.
21 #
22 # You should have received a copy of the GNU General Public License
23 # along with this program. If not, see <https://www.gnu.org/licenses/>.
24 #
25 
26 import os
27 import lsst.utils
28 import lsst.afw.image as afwImage
29 import lsst.afw.math as afwMath
30 import lsst.afw.display as afwDisplay
31 
32 try:
33  display
34 except NameError:
35  display = not False
36 
37 afwDisplay.setDefaultMaskTransparency(75)
38 
39 
40 
41 
42 def getImage():
43  imagePath = os.path.join(lsst.utils.getPackageDir("afwdata"),
44  "DC3a-Sim", "sci", "v5-e0", "v5-e0-c011-a00.sci.fits")
45  return afwImage.MaskedImageF(imagePath)
46 
47 
48 def simpleBackground(image):
49  binsize = 128
50  nx = int(image.getWidth()/binsize) + 1
51  ny = int(image.getHeight()/binsize) + 1
52  bctrl = afwMath.BackgroundControl(nx, ny)
53 
54  bkgd = afwMath.makeBackground(image, bctrl)
55 
56  image -= bkgd.getImageF(afwMath.Interpolate.NATURAL_SPLINE)
57 
58  return bkgd
59 
60 
61 def complexBackground(image):
62  MaskPixel = afwImage.MaskPixel
63  binsize = 128
64  nx = int(image.getWidth()/binsize) + 1
65  ny = int(image.getHeight()/binsize) + 1
66 
68  sctrl.setNumSigmaClip(3)
69  sctrl.setNumIter(4)
70  sctrl.setAndMask(afwImage.Mask[MaskPixel].getPlaneBitMask(["INTRP",
71  "EDGE"]))
72  sctrl.setNoGoodPixelsMask(afwImage.Mask[MaskPixel].getPlaneBitMask("BAD"))
73  sctrl.setNanSafe(True)
74  if False:
75  sctrl.setWeighted(True)
76  sctrl.setCalcErrorFromInputVariance(True)
77 
78  bctrl = afwMath.BackgroundControl(nx, ny, sctrl, afwMath.MEANCLIP)
79 
80  bkgd = afwMath.makeBackground(image, bctrl)
81 
82  statsImage = bkgd.getStatsImage()
83  afwDisplay.Display(frame=3).mtv(statsImage.getVariance(), title="statsImage Variance")
84 
85  return bkgd
86 
87 
88 def main():
89  image = getImage()
90 
91  if display:
92  afwDisplay.Display(frame=0).mtv(image, title="Image")
93 
94  bkgd = simpleBackground(image)
95  image = getImage()
96  bkgd = complexBackground(image)
97 
98  if display:
99  afwDisplay.Display(frame=1).mtv(image, title="image")
100  afwDisplay.Display(frame=2).mtv(bkgd.getStatsImage(), title="background")
101 
102  order = 2
104  afwMath.ApproximateControl.CHEBYSHEV, order, order)
105  approx = bkgd.getApproximate(actrl)
106 
107  approx.getImage()
108  approx.getMaskedImage()
109  approx.getImage(order - 1)
110 
111 
112 
113 if __name__ == '__main__':
114  main()