33 #include "boost/format.hpp" 35 #include "lsst/pex/exceptions.h" 36 #include "lsst/afw/geom.h" 39 namespace pexExcept = lsst::pex::exceptions;
40 namespace afwGeom = lsst::afw::geom;
41 namespace afwImage = lsst::afw::image;
49 CheckMask(lsst::afw::image::MaskPixel badPixel) : _badPixel(badPixel) {}
52 bool operator()(T val)
const {
53 return ((val.mask() & _badPixel) == 0) ? true :
false;
56 lsst::afw::image::MaskPixel _badPixel;
62 struct CheckKnownValue {
63 CheckKnownValue(lsst::afw::image::MaskPixel) {}
66 bool operator()(T val)
const {
67 return !std::isnan(static_cast<float>(*val));
81 template <
typename ImageT,
typename isVal
idPixel>
82 int copyGoodPixelsImpl(
84 ImageT
const &srcImage,
85 lsst::afw::image::MaskPixel
const badPixelMask
87 afwGeom::Box2I overlapBBox = destImage.getBBox();
88 overlapBBox.clip(srcImage.getBBox());
89 if (overlapBBox.isEmpty()) {
93 ImageT destView(destImage, overlapBBox, afwImage::PARENT,
false);
94 ImageT srcView(srcImage, overlapBBox, afwImage::PARENT,
false);
96 isValidPixel
const isValid(badPixelMask);
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;
115 template <
typename ImagePixelT>
118 lsst::afw::image::Image<ImagePixelT> &destImage,
119 lsst::afw::image::Image<ImagePixelT>
const &srcImage
121 typedef lsst::afw::image::Image<ImagePixelT> Image;
122 return copyGoodPixelsImpl<Image, CheckKnownValue>(destImage, srcImage, 0x0);
125 template <
typename ImagePixelT>
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
134 typedef lsst::afw::image::MaskedImage<ImagePixelT> Image;
135 return copyGoodPixelsImpl<Image, CheckMask>(destImage, srcImage, badPixelMask);
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 \ 149 template int coaddUtils::copyGoodPixels<IMAGEPIXEL>( \ 150 MASKEDIMAGE(IMAGEPIXEL) &destImage, \ 151 MASKEDIMAGE(IMAGEPIXEL) const &srcImage, \ 152 afwImage::MaskPixel const badPixelMask \ 158 INSTANTIATE(std::uint16_t);
int copyGoodPixels(lsst::afw::image::Image< ImagePixelT > &destImage, lsst::afw::image::Image< ImagePixelT > const &srcImage)
copy good pixels from one image to another