31 #pragma clang diagnostic push
32 #pragma clang diagnostic ignored "-Wunused-variable"
33 #pragma clang diagnostic pop
34 #include "boost/format.hpp"
46 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
49 : _image(new
Image(width, height)),
50 _mask(new
Mask(width, height, planeDict)),
51 _variance(new
Variance(width, height)) {
57 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
68 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
77 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
84 : _image(), _mask(), _variance() {
86 *
this = reader.
read<ImagePixelT, MaskPixelT, VariancePixelT>(
bbox, origin, conformMasks, needAllHdus,
97 if (varianceMetadata) {
102 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
109 : _image(), _mask(), _variance() {
111 *
this = reader.
read<ImagePixelT, MaskPixelT, VariancePixelT>(
bbox, origin, conformMasks, needAllHdus,
122 if (varianceMetadata) {
127 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
130 ImageOrigin origin,
bool conformMasks,
bool needAllHdus,
134 : _image(), _mask(), _variance() {
136 *
this = reader.
read<ImagePixelT, MaskPixelT, VariancePixelT>(
bbox, origin, conformMasks, needAllHdus,
147 if (varianceMetadata) {
152 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
159 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
161 : _image(rhs._image), _mask(rhs._mask), _variance(rhs._variance) {
171 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
175 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
181 : _image(new
Image(*rhs.getImage(),
bbox, origin, deep)),
182 _mask(rhs._mask ? new
Mask(*rhs.getMask(),
bbox, origin, deep) : static_cast<
Mask*>(nullptr)),
183 _variance(rhs._variance ? new
Variance(*rhs.getVariance(),
bbox, origin, deep)
184 : static_cast<
Variance*>(nullptr)) {
188 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
192 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
196 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
200 _image.swap(rhs._image);
201 _mask.swap(rhs._mask);
202 _variance.swap(rhs._variance);
206 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
209 *_image = rhs.
image();
216 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
219 *_image = rhs.
image();
226 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
235 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
244 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
247 (*_image).scaledPlus(c, *rhs.
getImage());
249 (*_variance).scaledPlus(c * c, *rhs.
getVariance());
252 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
259 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
268 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
271 (*_image).scaledMinus(c, *rhs.
getImage());
273 (*_variance).scaledPlus(c * c, *rhs.
getVariance());
276 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
285 template <
typename ImagePixelT,
typename VariancePixelT>
286 struct productVariance {
287 double operator()(ImagePixelT lhs, ImagePixelT rhs, VariancePixelT varLhs, VariancePixelT varRhs) {
288 return lhs * lhs * varRhs + rhs * rhs * varLhs;
294 template <
typename ImagePixelT,
typename VariancePixelT>
295 struct scaledProductVariance {
297 scaledProductVariance(
double const c) :
_c(c) {}
298 double operator()(ImagePixelT lhs, ImagePixelT rhs, VariancePixelT varLhs, VariancePixelT varRhs) {
299 return _c *
_c * (lhs * lhs * varRhs + rhs * rhs * varLhs);
304 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
308 if (_image->getDimensions() != rhs._image->getDimensions()) {
310 boost::str(boost::format(
"Images are of different size, %dx%d v %dx%d") %
311 _image->getWidth() % _image->getHeight() % rhs._image->getWidth() % rhs._image->getHeight()));
313 transform_pixels(_image->_getRawView(),
314 rhs._image->_getRawView(),
315 _variance->_getRawView(),
316 rhs._variance->_getRawView(),
317 _variance->_getRawView(),
318 productVariance<ImagePixelT, VariancePixelT>());
325 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
329 if (_image->getDimensions() != rhs._image->getDimensions()) {
331 boost::str(boost::format(
"Images are of different size, %dx%d v %dx%d") %
332 _image->getWidth() % _image->getHeight() % rhs._image->getWidth() % rhs._image->getHeight()));
334 transform_pixels(_image->_getRawView(),
335 rhs._image->_getRawView(),
336 _variance->_getRawView(),
337 rhs._variance->_getRawView(),
338 _variance->_getRawView(),
339 scaledProductVariance<ImagePixelT, VariancePixelT>(c));
341 (*_image).scaledMultiplies(c, *rhs.
getImage());
345 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
349 *_variance *= rhs * rhs;
355 template <
typename ImagePixelT,
typename VariancePixelT>
356 struct quotientVariance {
357 double operator()(ImagePixelT lhs, ImagePixelT rhs, VariancePixelT varLhs, VariancePixelT varRhs) {
358 ImagePixelT
const rhs2 = rhs * rhs;
359 return (lhs * lhs * varRhs + rhs2 * varLhs) / (rhs2 * rhs2);
364 template <
typename ImagePixelT,
typename VariancePixelT>
365 struct scaledQuotientVariance {
367 scaledQuotientVariance(
double c) :
_c(c) {}
368 double operator()(ImagePixelT lhs, ImagePixelT rhs, VariancePixelT varLhs, VariancePixelT varRhs) {
369 ImagePixelT
const rhs2 = rhs * rhs;
370 return (lhs * lhs * varRhs + rhs2 * varLhs) / (
_c *
_c * rhs2 * rhs2);
375 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
379 if (_image->getDimensions() != rhs._image->getDimensions()) {
381 boost::str(boost::format(
"Images are of different size, %dx%d v %dx%d") %
382 _image->getWidth() % _image->getHeight() % rhs._image->getWidth() % rhs._image->getHeight()));
384 transform_pixels(_image->_getRawView(),
385 rhs._image->_getRawView(),
386 _variance->_getRawView(),
387 rhs._variance->_getRawView(),
388 _variance->_getRawView(),
389 quotientVariance<ImagePixelT, VariancePixelT>());
396 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
400 if (_image->getDimensions() != rhs._image->getDimensions()) {
402 str(boost::format(
"Images are of different size, %dx%d v %dx%d") %
403 _image->getWidth() % _image->getHeight() % rhs._image->getWidth() % rhs._image->getHeight()));
405 transform_pixels(_image->_getRawView(),
406 rhs._image->_getRawView(),
407 _variance->_getRawView(),
408 rhs._variance->_getRawView(),
409 _variance->_getRawView(),
410 scaledQuotientVariance<ImagePixelT, VariancePixelT>(c));
412 (*_image).scaledDivides(c, *rhs.
getImage());
413 *_mask |= *rhs._mask;
416 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
420 *_variance /= rhs * rhs;
424 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
431 writeFits(fitsfile, metadata, imageMetadata, maskMetadata, varianceMetadata);
434 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
441 writeFits(fitsfile, metadata, imageMetadata, maskMetadata, varianceMetadata);
449 hdr = metadata->deepCopy();
453 hdr->set(
"INHERIT",
true);
454 hdr->set(
"EXTTYPE", exttype);
455 hdr->set(
"EXTNAME", exttype);
460 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
470 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
479 writeFits(fitsfile, imageOptions, maskOptions, varianceOptions, metadata, imageMetadata, maskMetadata,
483 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
492 writeFits(fitsfile, imageOptions, maskOptions, varianceOptions, metadata, imageMetadata, maskMetadata,
496 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
506 header = metadata->deepCopy();
508 header = std::make_shared<daf::base::PropertyList>();
513 "MaskedImage::writeFits can only write to an empty file");
515 if (fitsfile.
getHdu() < 1) {
523 processPlaneMetadata(imageMetadata, header,
"IMAGE");
524 _image->writeFits(fitsfile, imageOptions, header, _mask);
526 processPlaneMetadata(maskMetadata, header,
"MASK");
527 _mask->writeFits(fitsfile, maskOptions, header);
529 processPlaneMetadata(varianceMetadata, header,
"VARIANCE");
530 _variance->writeFits(fitsfile, varianceOptions, header, _mask);
537 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
539 if (!_mask || _mask->getWidth() == 0 || _mask->getHeight() == 0) {
540 _mask = MaskPtr(
new Mask(_image->getBBox()));
543 if (_mask->getDimensions() != _image->getDimensions()) {
546 (boost::format(
"Dimension mismatch: Image %dx%d v. Mask %dx%d") % _image->getWidth() %
547 _image->getHeight() % _mask->getWidth() % _mask->getHeight())
552 if (!_variance || _variance->getWidth() == 0 || _variance->getHeight() == 0) {
553 _variance = VariancePtr(
new Variance(_image->getBBox()));
556 if (_variance->getDimensions() != _image->getDimensions()) {
558 pex::exceptions::LengthError,
559 (boost::format(
"Dimension mismatch: Image %dx%d v. Variance %dx%d") % _image->getWidth() %
560 _image->getHeight() % _variance->getWidth() % _variance->getHeight())
569 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
573 return iterator(_image->begin(), _mask->begin(), _variance->begin());
579 return iterator(imageBegin, maskBegin, varianceBegin);
583 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
590 return iterator(imageEnd, maskEnd, varianceEnd);
593 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
603 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
613 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
623 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
630 return x_iterator(imageBegin, maskBegin, varianceBegin);
633 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
640 return x_iterator(imageEnd, maskEnd, varianceEnd);
643 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
650 return y_iterator(imageBegin, maskBegin, varianceBegin);
653 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
660 return y_iterator(imageEnd, maskEnd, varianceEnd);
663 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
673 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
683 template <
typename ImagePixelT1,
typename ImagePixelT2>
694 #define INSTANTIATE2(ImagePixelT1, ImagePixelT2) \
695 template bool imagesOverlap<ImagePixelT1, ImagePixelT2>(MaskedImage<ImagePixelT1> const&, \
696 MaskedImage<ImagePixelT2> const&);
698 template class MaskedImage<std::uint16_t>;
699 template class MaskedImage<int>;
700 template class MaskedImage<float>;
701 template class MaskedImage<double>;
702 template class MaskedImage<std::uint64_t>;
#define LSST_EXCEPT(type,...)
afw::table::PointKey< int > dimensions
#define INSTANTIATE2(ImagePixelT1, ImagePixelT2)
A simple struct that combines the two arguments that must be passed to most cfitsio routines and cont...
void createEmpty()
Create an empty image HDU with NAXIS=0 at the end of the file.
void setHdu(int hdu, bool relative=false)
Set the current HDU.
int countHdus()
Return the number of HDUs in the file.
int getHdu()
Return the current HDU (0-indexed; 0 is the Primary HDU).
void writeMetadata(daf::base::PropertySet const &metadata)
Read a FITS header into a PropertySet or PropertyList.
Lifetime-management for memory that goes into FITS memory files.
typename _view_t::iterator iterator
An STL compliant iterator.
x_iterator fast_iterator
A fast STL compliant iterator for contiguous images N.b.
typename _view_t::reverse_iterator reverse_iterator
An STL compliant reverse iterator.
typename _view_t::x_iterator x_iterator
An iterator for traversing the pixels in a row.
typename _view_t::y_iterator y_iterator
An iterator for traversing the pixels in a column.
A class to represent a 2-dimensional array of pixels.
Represent a 2-dimensional array of bitmask pixels.
An iterator to the MaskedImage.
A FITS reader class for MaskedImages and their components.
std::shared_ptr< daf::base::PropertyList > readImageMetadata()
Read the FITS header of one of the HDUs.
std::shared_ptr< daf::base::PropertyList > readPrimaryMetadata()
Read the FITS header of one of the HDUs.
std::shared_ptr< daf::base::PropertyList > readMaskMetadata()
Read the FITS header of one of the HDUs.
std::shared_ptr< daf::base::PropertyList > readVarianceMetadata()
Read the FITS header of one of the HDUs.
MaskedImage< ImagePixelT, MaskPixelT, VariancePixelT > read(lsst::geom::Box2I const &bbox=lsst::geom::Box2I(), ImageOrigin origin=PARENT, bool conformMasks=false, bool needAllHdus=false, bool allowUnsafe=false)
Read the full MaskedImage.
A class to manipulate images, masks, and variance as a single object.
void scaledPlus(double const c, MaskedImage const &rhs)
Add a scaled MaskedImage c*rhs to a MaskedImage.
lsst::afw::image::Image< VariancePixelT > Variance
void writeFits(std::string const &fileName, std::shared_ptr< daf::base::PropertySet const > metadata=std::shared_ptr< daf::base::PropertySet const >(), std::shared_ptr< daf::base::PropertySet const > imageMetadata=std::shared_ptr< daf::base::PropertySet const >(), std::shared_ptr< daf::base::PropertySet const > maskMetadata=std::shared_ptr< daf::base::PropertySet const >(), std::shared_ptr< daf::base::PropertySet const > varianceMetadata=std::shared_ptr< daf::base::PropertySet const >()) const
Write a MaskedImage to a regular FITS file.
MaskedImage(unsigned int width, unsigned int height, MaskPlaneDict const &planeDict=MaskPlaneDict())
Construct from a supplied dimensions.
void scaledDivides(double const c, MaskedImage const &rhs)
MaskedImageIterator< typename Image::y_iterator, typename Mask::y_iterator, typename Variance::y_iterator > y_iterator
An iterator to a column of a MaskedImage.
typename Mask< MaskPixelT >::MaskPlaneDict MaskPlaneDict
The Mask's MaskPlaneDict.
iterator begin() const
Return an iterator to the start of the image.
reverse_iterator rbegin() const
Return a reverse_iterator to the start of the image.
lsst::afw::image::Mask< MaskPixelT > Mask
y_iterator col_end(int x) const
Return an y_iterator to the end of the image.
void scaledMinus(double const c, MaskedImage const &rhs)
Subtract a scaled MaskedImage c*rhs from a MaskedImage.
MaskedImageIterator< typename Image::reverse_iterator, typename Mask::reverse_iterator, typename Variance::reverse_iterator > reverse_iterator
MaskedImageIterator< typename Image::iterator, typename Mask::iterator, typename Variance::iterator > iterator
MaskedImage & operator-=(ImagePixelT const rhs)
Subtract a scalar rhs from a MaskedImage.
x_iterator row_end(int y) const
Return an x_iterator to the end of the image.
void scaledMultiplies(double const c, MaskedImage const &rhs)
iterator end() const
Return an iterator to the end of the image.
void assign(MaskedImage const &rhs, lsst::geom::Box2I const &bbox=lsst::geom::Box2I(), ImageOrigin origin=PARENT)
Copy pixels from another masked image to a specified subregion of this masked image.
VariancePtr getVariance() const
Return a (shared_ptr to) the MaskedImage's variance.
MaskedImage & operator=(MaskedImage const &rhs)
Make the lhs use the rhs's pixels.
lsst::afw::image::Image< ImagePixelT > Image
x_iterator row_begin(int y) const
Return an x_iterator to the start of the image.
void swap(MaskedImage &rhs)
y_iterator col_begin(int x) const
Return an y_iterator to the start of the image.
reverse_iterator rend() const
Return a reverse_iterator to the end of the image.
MaskedImage & operator+=(ImagePixelT const rhs)
Add a scalar rhs to a MaskedImage.
MaskedImage & operator*=(ImagePixelT const rhs)
iterator at(int const x, int const y) const
Return an iterator at the point (x, y)
MaskedImage & operator/=(ImagePixelT const rhs)
MaskPtr getMask() const
Return a (shared_ptr to) the MaskedImage's mask.
ImagePtr getImage() const
Return a (shared_ptr to) the MaskedImage's image.
A pixel of a MaskedImage.
MaskPixelT mask() const
Return the mask part of a Pixel.
ImagePixelT image() const
Return the image part of a Pixel.
VariancePixelT variance() const
Return the variance part of a Pixel.
A single pixel of the same type as a MaskedImage.
VariancePixelT variance() const
ImagePixelT image() const
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects.
bool imagesOverlap(ImageBase< T1 > const &image1, ImageBase< T2 > const &image2)
Return true if the pixels for two images or masks overlap in memory.
A base class for image defects.
Options for writing an image to FITS.