lsst.coadd.utils
g89139ef638+6dab958613
Toggle main menu visibility
Loading...
Searching...
No Matches
src
copyGoodPixels.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
30
#include <cstdint>
31
#include <limits>
32
33
#include "boost/format.hpp"
34
35
#include "
lsst/pex/exceptions.h
"
36
#include "
lsst/geom.h
"
37
#include "
lsst/coadd/utils/copyGoodPixels.h
"
38
39
namespace
pexExcept
=
lsst::pex::exceptions
;
40
namespace
geom
=
lsst::geom
;
41
namespace
afwImage
=
lsst::afw::image
;
42
namespace
coaddUtils
=
lsst::coadd::utils
;
43
44
namespace
{
45
/*
46
* A boolean functor to test if a MaskedImage pixel is valid (mask & badPixel == 0)
47
*/
48
struct
CheckMask {
49
CheckMask(
lsst::afw::image::MaskPixel
badPixel) : _badPixel(badPixel) {}
50
51
template
<
typename
T>
52
bool
operator()(T val)
const
{
53
return
((val.mask() & _badPixel) == 0) ? true :
false
;
54
}
55
private
:
56
lsst::afw::image::MaskPixel
_badPixel;
57
};
58
59
/*
60
* A boolean functor to test if an Image pixel has known value (not NaN)
61
*/
62
struct
CheckKnownValue {
63
CheckKnownValue(
lsst::afw::image::MaskPixel
) {}
64
65
template
<
typename
T>
66
bool
operator()(T val)
const
{
67
return
!
std::isnan
(
static_cast<
float
>
(*val));
68
}
69
};
70
71
/*
72
* Implementation of copyGoodPixels
73
*
74
* The template parameter isValidPixel is a functor with operator()
75
* which returns true if a given image pixel is valid.
76
* This allows us to support multiple image types including
77
* MaskedImage with a mask bit and Image with a check for NaN.
78
*
79
* @return overlapping bounding box, relative to parent image
80
*/
81
template
<
typename
ImageT,
typename
isVal
id
Pixel>
82
int
copyGoodPixelsImpl(
83
ImageT &destImage,
84
ImageT
const
&srcImage,
85
lsst::afw::image::MaskPixel
const
badPixelMask
86
) {
87
geom::Box2I overlapBBox = destImage.getBBox();
88
overlapBBox.
clip
(srcImage.getBBox());
89
if
(overlapBBox.
isEmpty
()) {
90
return
0;
91
}
92
93
ImageT destView(destImage, overlapBBox,
afwImage::PARENT
,
false
);
94
ImageT srcView(srcImage, overlapBBox,
afwImage::PARENT
,
false
);
95
96
isValidPixel
const
isValid(badPixelMask);
// functor to check if a pixel is good
97
int
numGoodPix = 0;
98
for
(
int
y = 0, endY = srcView.getHeight(); y != endY; ++y) {
99
typename
ImageT::const_x_iterator srcIter = srcView.row_begin(y);
100
typename
ImageT::const_x_iterator
const
srcEndIter = srcView.row_end(y);
101
typename
ImageT::x_iterator destIter = destView.row_begin(y);
102
for
(; srcIter != srcEndIter; ++srcIter, ++destIter) {
103
if
(isValid(srcIter)) {
104
*destIter = *srcIter;
105
// typename ImageT::SinglePixel pix = *srcIter;
106
// *destIter = pix;
107
++numGoodPix;
108
}
109
}
110
}
111
return
numGoodPix;
112
}
113
}
// anonymous namespace
114
115
template
<
typename
ImagePixelT>
116
int
coaddUtils::copyGoodPixels
(
117
// spell out lsst:afw::image to make Doxygen happy
118
lsst::afw::image::Image<ImagePixelT>
&destImage,
119
lsst::afw::image::Image<ImagePixelT>
const
&srcImage
120
) {
121
typedef
lsst::afw::image::Image<ImagePixelT>
Image;
122
return
copyGoodPixelsImpl<Image, CheckKnownValue>(destImage, srcImage, 0x0);
123
}
124
125
template
<
typename
ImagePixelT>
126
int
coaddUtils::copyGoodPixels
(
127
// spell out lsst:afw::image to make Doxygen happy
128
lsst::afw::image::MaskedImage
<ImagePixelT,
lsst::afw::image::MaskPixel
,
129
lsst::afw::image::VariancePixel
> &destImage,
130
lsst::afw::image::MaskedImage
<ImagePixelT,
lsst::afw::image::MaskPixel
,
131
lsst::afw::image::VariancePixel
>
const
&srcImage,
132
lsst::afw::image::MaskPixel
const
badPixelMask
133
) {
134
typedef
lsst::afw::image::MaskedImage<ImagePixelT>
Image;
135
return
copyGoodPixelsImpl<Image, CheckMask>(destImage, srcImage, badPixelMask);
136
}
137
138
// Explicit instantiations
139
141
#define MASKEDIMAGE(IMAGEPIXEL) afwImage::MaskedImage<IMAGEPIXEL, \
142
afwImage::MaskPixel, afwImage::VariancePixel>
143
#define INSTANTIATE(IMAGEPIXEL) \
144
template int coaddUtils::copyGoodPixels<IMAGEPIXEL>( \
145
afwImage::Image<IMAGEPIXEL> &destImage, \
146
afwImage::Image<IMAGEPIXEL> const &srcImage \
147
); \
148
\
149
template int coaddUtils::copyGoodPixels<IMAGEPIXEL>( \
150
MASKEDIMAGE(IMAGEPIXEL) &destImage, \
151
MASKEDIMAGE(IMAGEPIXEL) const &srcImage, \
152
afwImage::MaskPixel const badPixelMask \
153
);
154
155
INSTANTIATE
(
double
);
156
INSTANTIATE
(
float
);
157
INSTANTIATE
(
int
);
158
INSTANTIATE
(
std::uint16_t
);
INSTANTIATE
#define INSTANTIATE(FROMSYS, TOSYS)
lsst::afw::image::Image
lsst::afw::image::MaskedImage
lsst::geom::Box2I::clip
void clip(Box2I const &other) noexcept
lsst::geom::Box2I::isEmpty
bool isEmpty() const noexcept
copyGoodPixels.h
exceptions.h
geom.h
std::uint16_t
std::isnan
T isnan(T... args)
lsst::afw::image
lsst::afw::image::MaskPixel
std::int32_t MaskPixel
lsst::afw::image::VariancePixel
float VariancePixel
lsst::afw::image::PARENT
PARENT
lsst::coadd::utils
Definition
addToCoadd.h:37
lsst::coadd::utils::copyGoodPixels
int copyGoodPixels(lsst::afw::image::Image< ImagePixelT > &destImage, lsst::afw::image::Image< ImagePixelT > const &srcImage)
copy good pixels from one image to another
Definition
copyGoodPixels.cc:116
lsst::geom
lsst::pex::exceptions
Generated on
for lsst.coadd.utils by
1.17.0