LSST Applications g02d81e74bb+86cf3d8bc9,g180d380827+7a4e862ed4,g2079a07aa2+86d27d4dc4,g2305ad1205+e1ca1c66fa,g29320951ab+012e1474a1,g295015adf3+341ea1ce94,g2bbee38e9b+0e5473021a,g337abbeb29+0e5473021a,g33d1c0ed96+0e5473021a,g3a166c0a6a+0e5473021a,g3ddfee87b4+c429d67c83,g48712c4677+f88676dd22,g487adcacf7+27e1e21933,g50ff169b8f+96c6868917,g52b1c1532d+585e252eca,g591dd9f2cf+b41db86c35,g5a732f18d5+53520f316c,g64a986408d+86cf3d8bc9,g858d7b2824+86cf3d8bc9,g8a8a8dda67+585e252eca,g99cad8db69+84912a7fdc,g9ddcbc5298+9a081db1e4,ga1e77700b3+15fc3df1f7,ga8c6da7877+a2b54eae19,gb0e22166c9+60f28cb32d,gba4ed39666+c2a2e4ac27,gbb8dafda3b+6681f309db,gc120e1dc64+f0fcc2f6d8,gc28159a63d+0e5473021a,gcf0d15dbbd+c429d67c83,gdaeeff99f8+f9a426f77a,ge6526c86ff+0433e6603d,ge79ae78c31+0e5473021a,gee10cc3b42+585e252eca,gff1a9f87cc+86cf3d8bc9,w.2024.17
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
33#include "lsst/afw.h"
35
36namespace lsst {
37namespace meas {
38namespace algorithms {
39
40template <typename ImageT>
42 Super::analyze();
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
int min
int end
int max
#define INSTANTIATE(FROMSYS, TOSYS)
Definition Detector.cc:509
uint64_t * ptr
Definition RangeSet.cc:95
int y
Definition SpanSet.cc:48
T begin(T... args)
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