LSST Applications g0265f82a02+c6dfa2ddaf,g1162b98a3f+ffe7eabc7e,g2079a07aa2+1b2e822518,g2bbee38e9b+c6dfa2ddaf,g337abbeb29+c6dfa2ddaf,g36da64cc00+ea84795170,g3ddfee87b4+955a963fd8,g50ff169b8f+2eb0e556e8,g52b1c1532d+90ebb246c7,g555ede804d+955a963fd8,g591dd9f2cf+bac198a2cb,g5ec818987f+420292cfeb,g858d7b2824+d6c9a0a3b8,g876c692160+aabc49a3c3,g8a8a8dda67+90ebb246c7,g8cdfe0ae6a+4fd9e222a8,g99cad8db69+e6cd765486,g9ddcbc5298+a1346535a5,ga1e77700b3+df8f93165b,ga8c6da7877+acd47f83f4,gae46bcf261+c6dfa2ddaf,gb0e22166c9+8634eb87fb,gb3f2274832+12c8382528,gba4ed39666+1ac82b564f,gbb8dafda3b+0574160a1f,gbeb006f7da+dea2fbb49f,gc28159a63d+c6dfa2ddaf,gc86a011abf+d6c9a0a3b8,gcf0d15dbbd+955a963fd8,gdaeeff99f8+1cafcb7cd4,gdc0c513512+d6c9a0a3b8,ge79ae78c31+c6dfa2ddaf,geb67518f79+ba1859f325,gee10cc3b42+90ebb246c7,gf1cff7945b+d6c9a0a3b8,w.2024.13
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