LSST Applications g03df0211f3+8b6105f8fc,g0485b4d2cb+45260c2012,g0fba68d861+813d85fc8e,g1ec0fe41b4+eb5f8a2046,g1fd858c14a+e269eb4372,g2440f9efcc+8c5ae1fdc5,g35bb328faa+8c5ae1fdc5,g4d2262a081+dc5b8b6bf1,g53246c7159+8c5ae1fdc5,g60b5630c4e+f1fad26f6f,g65f11fe441+7edbc1d107,g67b6fd64d1+0750dd6554,g78460c75b0+7e33a9eb6d,g786e29fd12+668abc6043,g81e10462b5+f1fad26f6f,g8352419a5c+8c5ae1fdc5,g8852436030+12a0fb455e,g89139ef638+0750dd6554,g94187f82dc+f1fad26f6f,g989de1cb63+0750dd6554,g9d31334357+f1fad26f6f,g9f33ca652e+56aa2a5167,gabe3b4be73+8856018cbb,gabf8522325+7d313c7892,gb1101e3267+98d82a3094,gb89ab40317+0750dd6554,gc91f06edcd+6cd211b5dc,gcf25f946ba+12a0fb455e,gd6cbbdb0b4+d675535a7f,gdb8242c116+58a029c71f,gde0f65d7ad+fa0bcaf562,ge278dab8ac+edfcd09300,ge410e46f29+0750dd6554,gf35d7ec915+97dd712d81,gf49a0b2092+d38ddc9ecb,gf5e32f922b+8c5ae1fdc5,gf67bdafdda+0750dd6554,gf6800124b1+a111834ec1,w.2025.20
LSST Data Management Base Package
Loading...
Searching...
No Matches
ImagePca.cc
Go to the documentation of this file.
1// -*- LSST-C++ -*-
2
3/*
4 * LSST Data Management System
5 * Copyright 2008, 2009, 2010 LSST Corporation.
6 *
7 * This product includes software developed by the
8 * LSST Project (http://www.lsst.org/).
9 *
10 * This program is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the LSST License Statement and
21 * the GNU General Public License along with this program. If not,
22 * see <http://www.lsstcorp.org/LegalNotices/>.
23 */
24
32
33#include "lsst/afw.h"
35
36namespace lsst {
37namespace meas {
38namespace algorithms {
39
40template <typename ImageT>
43
44 typename Super::ImageList const &eImageList = this->getEigenImages();
45 typename Super::ImageList::const_iterator iter = eImageList.begin(), end = eImageList.end();
46 for (size_t i = 0; iter != end; ++i, ++iter) {
47 std::shared_ptr<ImageT> eImage = *iter;
48
49 /*
50 * Normalise eigenImages to have a maximum of 1.0. For n > 0 they
51 * (should) have mean == 0, so we can't use that to normalize
52 */
54 double const min = stats.getValue(afw::math::MIN);
55 double const max = stats.getValue(afw::math::MAX);
56
57 double const extreme = (fabs(min) > max) ? min : max;
58 if (extreme != 0.0) {
59 *eImage /= extreme;
60 }
61
62 /*
63 * Estimate and subtract the mean background level from the i > 0
64 * eigen images; if we don't do that then PSF variation can get mixed
65 * with subtle variations in the background and potentially amplify
66 * them disasterously.
67 *
68 * It is not at all clear that doing this is a good idea; it'd be
69 * better to get the sky level right in the first place.
70 */
71 if (i > 0 && _border > 0) { /* not the zeroth KL component */
72 int const height = eImage->getHeight();
73 int const width = eImage->getWidth();
74 double background;
75 if (2 * _border >= std::min(height, width)) {
76 // _Border consumes the entire image
79 .getValue();
80 } else {
81 // Use the median of the edge pixels
82
83 // If ImageT is a MaskedImage, unpack the Image
86
87 int const nEdge = width * height - (width - 2 * _border) * (height - 2 * _border);
88 std::vector<double> edgePixels(nEdge);
89
90 std::vector<double>::iterator bi = edgePixels.begin();
91
93 int y = 0;
94 for (; y != _border; ++y) { // Bottom border of eImage
95 for (imIter ptr = eImageIm->row_begin(y), end = eImageIm->row_end(y); ptr != end;
96 ++ptr, ++bi) {
97 *bi = *ptr;
98 }
99 }
100 for (; y != height - _border; ++y) { // Left and right borders of eImage
101 for (imIter ptr = eImageIm->row_begin(y), end = eImageIm->x_at(_border, y); ptr != end;
102 ++ptr, ++bi) {
103 *bi = *ptr;
104 }
105 for (imIter ptr = eImageIm->x_at(width - _border, y), end = eImageIm->row_end(y);
106 ptr != end; ++ptr, ++bi) {
107 *bi = *ptr;
108 }
109 }
110 for (; y != height; ++y) { // Top border of eImage
111 for (imIter ptr = eImageIm->row_begin(y), end = eImageIm->row_end(y); ptr != end;
112 ++ptr, ++bi) {
113 *bi = *ptr;
114 }
115 }
116 assert(std::distance(edgePixels.begin(), bi) == nEdge);
117
118 background = afw::math::makeStatistics(edgePixels, afw::math::MEDIAN).getValue();
119 }
120 *eImage -= background;
121 }
122 }
123}
124
125#define INSTANTIATE_IMAGE(IMAGE) template class PsfImagePca<IMAGE>;
126
127#define INSTANTIATE(TYPE) \
128 INSTANTIATE_IMAGE(afw::image::Image<TYPE>); \
129 INSTANTIATE_IMAGE(afw::image::MaskedImage<TYPE>);
130
131INSTANTIATE(float);
132
133} // namespace algorithms
134} // namespace meas
135} // namespace lsst
#define INSTANTIATE(FROMSYS, TOSYS)
Definition Detector.cc:509
T begin(T... args)
ImageList const & getEigenImages() const
Return Eigen images.
Definition ImagePca.h:100
std::vector< std::shared_ptr< ImageT > > ImageList
Definition ImagePca.h:47
A class to evaluate image statistics.
Definition Statistics.h:222
double getValue(Property const prop=NOTHING) const
Return the value of the desired property (if specified in the constructor)
virtual void analyze()
Generate eigenimages that are normalised and background-subtracted.
Definition ImagePca.cc:41
T distance(T... args)
T end(T... args)
Class for doing PCA on PSF stars.
T min(T... args)
Statistics makeStatistics(lsst::afw::image::Image< Pixel > const &img, lsst::afw::image::Mask< image::MaskPixel > const &msk, int const flags, StatisticsControl const &sctrl=StatisticsControl())
Handle a watered-down front-end to the constructor (no variance)
Definition Statistics.h:361
@ MIN
estimate sample minimum
Definition Statistics.h:66
@ MEDIAN
estimate sample median
Definition Statistics.h:60
@ MAX
estimate sample maximum
Definition Statistics.h:67