23 #if !defined(LSST_AFW_IMAGE_PIXEL_H) 24 #define LSST_AFW_IMAGE_PIXEL_H 29 #include <type_traits> 38 template <
typename,
typename,
typename,
typename,
typename>
72 template <
typename _ImagePixelT,
typename _MaskPixelT,
typename _VariancePixelT =
double>
75 template <
typename,
typename,
typename>
87 template <
typename rhsExpr>
94 ImagePixelT
image()
const {
return _image; }
95 MaskPixelT
mask()
const {
return _mask; }
96 VariancePixelT
variance()
const {
return _variance; }
114 VariancePixelT _variance;
118 template <
typename PixelT>
127 template <
typename _ImagePixelT,
typename _MaskPixelT,
typename _VariancePixelT>
140 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
147 template <
typename _ImagePixelT,
typename _MaskPixelT,
typename _VariancePixelT =
double>
157 _image(image), _mask(mask), _variance(variance) {}
163 : _image(const_cast<ImagePixelT&>(image)),
164 _mask(const_cast<MaskPixelT&>(
mask)),
165 _variance(const_cast<VariancePixelT&>(
variance)) {}
169 : _image(rhs._image), _mask(rhs._mask), _variance(rhs._variance) {}
178 _image = rhs.
image();
188 template <
typename rhsExpr>
191 _image = rhs.image();
217 ImagePixelT
image()
const {
return _image; }
219 MaskPixelT
mask()
const {
return _mask; }
221 VariancePixelT
variance()
const {
return _variance; }
227 template <
typename T1>
229 return lhs.
image() == rhs.image() && lhs.
mask() == rhs.mask() && lhs.
variance() == rhs.variance();
233 template <
typename T1>
235 return !(lhs == rhs);
250 template <
typename ExprT>
259 template <
typename ExprT>
268 template <
typename ExprT>
277 template <
typename ExprT>
288 VariancePixelT& _variance;
292 template <
typename ExprT>
337 template <
typename T1>
347 template <
typename T1>
358 template <
typename T1>
360 T1
operator()(T1
const&
x, T1
const&
y, T1
const& vx, T1
const& vy)
const {
363 T1
const iy2 = 1.0 / y2;
364 return x2 * vy * iy2 * iy2 + vx * iy2;
367 T1
operator()(T1
const&, T1
const&
y, T1
const& vx)
const {
return vx / (y *
y); }
375 template <
typename T1>
377 T1
operator()(T1
const&
x, T1
const&
y, T1
const& vx, T1
const& vy)
const {
380 return x2 * vy + y2 * vx;
383 T1
operator()(T1
const&, T1
const&
y, T1
const& vx)
const {
return vx * y *
y; }
391 template <
typename T1>
393 T1
operator()(T1
const&, T1
const&, T1
const& vx, T1
const& vy)
const {
return vx + vy; }
395 T1
operator()(T1
const&, T1
const&, T1
const& vx)
const {
return vx; }
405 template <
typename T1>
409 T1
operator()(T1
const&, T1
const&, T1
const& vx, T1
const& vy)
const {
410 return vx + vy + 2 * _alpha * sqrt(vx * vy);
412 T1
operator()(T1
const&, T1
const&, T1
const& vx)
const {
return vx; }
419 template <
typename ExprT1,
typename ImageBinOp,
typename MaskBinOp,
typename VarianceBinOp>
426 UnaryExpr(ExprT1 e1, ImageBinOp imageOp = ImageBinOp(), MaskBinOp maskOp = MaskBinOp(),
427 VarianceBinOp varOp = VarianceBinOp())
428 : _expr1(e1), _imageOp(imageOp), _maskOp(maskOp), _varOp(varOp) {}
431 ImagePixelT
image()
const {
return _imageOp(_expr1.image()); }
434 MaskPixelT
mask()
const {
return _maskOp(_expr1.mask()); }
437 VariancePixelT
variance()
const {
return _varOp(_expr1.variance()); }
443 VarianceBinOp _varOp;
447 template <
typename ExprT1,
typename ExprT2,
typename ImageBinOp,
typename MaskBinOp,
typename VarianceBinOp>
454 BinaryExpr(ExprT1 e1, ExprT2 e2, ImageBinOp imageOp = ImageBinOp(), MaskBinOp maskOp = MaskBinOp(),
455 VarianceBinOp varOp = VarianceBinOp())
456 : _expr1(e1), _expr2(e2), _imageOp(imageOp), _maskOp(maskOp), _varOp(varOp) {}
460 BinaryExpr(ExprT1 e1, ExprT2 e2,
double const alpha, ImageBinOp imageOp = ImageBinOp(),
461 MaskBinOp maskOp = MaskBinOp(), VarianceBinOp = VarianceBinOp())
462 : _expr1(e1), _expr2(e2), _imageOp(imageOp), _maskOp(maskOp), _varOp(VarianceBinOp(alpha)) {}
464 ImagePixelT
image()
const {
return _imageOp(_expr1.image(), _expr2.image()); }
467 MaskPixelT
mask()
const {
return _maskOp(_expr1.mask(), _expr2.mask()); }
471 return _varOp(_expr1.image(), _expr2.image(), _expr1.variance(), _expr2.variance());
479 VarianceBinOp _varOp;
486 template <
typename ExprT1,
typename ImageBinOp,
typename MaskBinOp,
typename VarianceBinOp>
487 class BinaryExpr<ExprT1, double, ImageBinOp, MaskBinOp, VarianceBinOp> final {
493 BinaryExpr(ExprT1 e1,
double e2, ImageBinOp imageOp = ImageBinOp(), MaskBinOp maskOp = MaskBinOp(),
494 VarianceBinOp varOp = VarianceBinOp())
495 : _expr1(e1), _expr2(e2), _imageOp(imageOp), _maskOp(maskOp), _varOp(varOp) {}
499 BinaryExpr(ExprT1 e1,
double e2,
double const alpha, ImageBinOp imageOp = ImageBinOp(),
500 MaskBinOp maskOp = MaskBinOp(), VarianceBinOp = VarianceBinOp())
501 : _expr1(e1), _expr2(e2), _imageOp(imageOp), _maskOp(maskOp), _varOp(VarianceBinOp(alpha)) {}
503 ImagePixelT
image()
const {
return _imageOp(_expr1.image(), _expr2); }
506 MaskPixelT
mask()
const {
return _maskOp(_expr1.mask()); }
509 VariancePixelT
variance()
const {
return _varOp(_expr1.image(), _expr2, _expr1.variance()); }
516 VarianceBinOp _varOp;
520 template <
typename ExprT1>
525 noop<typename exprTraits<ExprT1>::MaskPixelT>,
531 template <
typename ExprT1,
typename ExprT2>
536 return BinaryExpr<ExprT1, ExprT2, std::plus<typename exprTraits<ExprT1>::ImagePixelT>,
537 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
542 template <
typename ExprT1,
typename ExprT2>
544 e1 = BinaryExpr<ExprT1, ExprT2, std::plus<typename exprTraits<ExprT1>::ImagePixelT>,
545 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
555 template <
typename ExprT1,
typename ExprT2>
556 ExprT1 doPlus(ExprT1 e1, ExprT2 e2,
double const, boost::mpl::true_) {
560 template <
typename ExprT1,
typename ExprT2>
561 BinaryExpr<ExprT1, ExprT2, std::plus<typename exprTraits<ExprT1>::ImagePixelT>,
562 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
564 doPlus(ExprT1 e1, ExprT2 e2,
double const alpha, boost::mpl::false_) {
565 return BinaryExpr<ExprT1, ExprT2, std::plus<typename exprTraits<ExprT1>::ImagePixelT>,
566 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
572 template <
typename ExprT1,
typename ExprT2>
583 template <
typename ExprT1,
typename ExprT2>
585 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
589 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
594 template <
typename ExprT1,
typename ExprT2>
597 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
604 template <
typename ExprT1,
typename ExprT2>
606 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
610 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
615 template <
typename ExprT1,
typename ExprT2>
618 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
625 template <
typename ExprT1,
typename ExprT2>
627 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
631 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
636 template <
typename ExprT1,
typename ExprT2>
639 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
645 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
646 std::ostream& operator<<(std::ostream& os, SinglePixel<ImagePixelT, MaskPixelT, VariancePixelT>
const& v) {
647 return os <<
"(" << v.image() <<
", " << v.mask() <<
", " << v.variance() <<
")";
651 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
652 std::ostream& operator<<(std::ostream& os, Pixel<ImagePixelT, MaskPixelT, VariancePixelT>
const& v) {
653 return os <<
"(" << v.image() <<
", " << v.mask() <<
", " << v.variance() <<
")";
657 template <
typename ExprT1,
typename ExprT2,
typename BinOp,
typename MaskBinOp,
typename VarBinOp>
658 std::ostream& operator<<(std::ostream& os, BinaryExpr<ExprT1, ExprT2, BinOp, MaskBinOp, VarBinOp>
const& v) {
659 return os <<
"(" << v.image() <<
", " << v.mask() <<
", " << v.variance() <<
")";
667 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
679 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
680 struct hash<
lsst::afw::image::pixel::SinglePixel<ImagePixelT, MaskPixelT, VariancePixelT>> {
688 MaskPixelT
mask = obj.mask();
689 VariancePixelT
variance = obj.variance();
690 return EquivalentPixel(image, mask, variance).hash_value();
MaskPixelT mask() const
evaluate the mask part of the expression
Pixel operator=(double const &rhs_image)
set the image part of a Pixel to rhs_image (the mask and variance are set to 0)
exprTraits< double >::MaskPixelT MaskPixelT
friend Pixel operator/=(Pixel const &e1, ExprT const &e2)
Evaluate e1 /= e2, and return e1.
Class for representing binary operations.
SinglePixel< ImagePixelT, MaskPixelT, VariancePixelT > makeSinglePixel(ImagePixelT x, MaskPixelT m, VariancePixelT v)
Return a SinglePixel.
bitwise_or doesn't seem to be in std::
BinaryExpr< ExprT1, ExprT2, std::multiplies< typename exprTraits< ExprT1 >::ImagePixelT >, bitwise_or< typename exprTraits< ExprT1 >::MaskPixelT >, variance_multiplies< typename exprTraits< ExprT1 >::VariancePixelT > > operator*(ExprT1 e1, ExprT2 e2)
Template to evaluate (e1 * e2)
VariancePixelT variance() const
Return the variance part of a Pixel.
SinglePixel< ImagePixelT, MaskPixelT, VariancePixelT > expr_type
ImagePixelT image() const
evaluate the image part of the expression
exprTraits< ExprT1 >::VariancePixelT VariancePixelT
BinaryExpr(ExprT1 e1, ExprT2 e2, ImageBinOp imageOp=ImageBinOp(), MaskBinOp maskOp=MaskBinOp(), VarianceBinOp varOp=VarianceBinOp())
A binary operation, with three functors to represent the image/mask/variance operations.
Pixel operator=(int const &rhs_image)
set the image part of a Pixel to rhs_image (the mask and variance are set to 0)
float Pixel
Typedefs to be used for pixel values.
T1 operator()(T1 const &, T1 const &, T1 const &vx) const
BinaryExpr(ExprT1 e1, double e2, ImageBinOp imageOp=ImageBinOp(), MaskBinOp maskOp=MaskBinOp(), VarianceBinOp varOp=VarianceBinOp())
A binary operation, with three functors to represent the image/mask/variance operations.
friend bool operator!=(Pixel const &lhs, T1 const &rhs)
Return true iff two pixels are unequal (in at least one of image, mask, and variance) ...
VariancePixelT variance() const
SinglePixel< ImagePixelT, MaskPixelT, VariancePixelT > expr_type
MaskPixelT mask() const
evaluate the mask part of the expression
Pixel(ImagePixelT const &image, MaskPixelT const &mask=0x0, VariancePixelT const &variance=0)
Construct a Pixel from references to its image/mask/variance components.
ExprT1 operator-=(ExprT1 &e1, ExprT2 e2)
Template to evaluate e1 -= e2.
T1 operator()(const T1 &x) const
T1 operator()(T1 const &x, T1 const &y, T1 const &vx, T1 const &vy) const
Pixel operator=(Pixel &&rhs)
ExprT::ImagePixelT ImagePixelT
A single pixel of the same type as a MaskedImage.
T1 operator()(T1 const &, T1 const &, T1 const &vx) const
T1 operator()(T1 const &x, T1 const &y, T1 const &vx, T1 const &vy) const
exprTraits< ExprT1 >::MaskPixelT MaskPixelT
BinaryExpr(ExprT1 e1, ExprT2 e2, double const alpha, ImageBinOp imageOp=ImageBinOp(), MaskBinOp maskOp=MaskBinOp(), VarianceBinOp=VarianceBinOp())
A binary operation, with three functors to represent the image/mask/variance operations and an extra ...
BinaryExpr< ExprT1, ExprT2, std::divides< typename exprTraits< ExprT1 >::ImagePixelT >, bitwise_or< typename exprTraits< ExprT1 >::MaskPixelT >, variance_divides< typename exprTraits< ExprT1 >::VariancePixelT > > operator/(ExprT1 e1, ExprT2 e2)
Template to evaluate (e1 / e2)
UnaryExpr(ExprT1 e1, ImageBinOp imageOp=ImageBinOp(), MaskBinOp maskOp=MaskBinOp(), VarianceBinOp varOp=VarianceBinOp())
a unary expression, with three functors to represent the image/mask/variance operations ...
ImagePixelT image() const
static const PixelT padValue()
The quantity to use when a pixel value is undefined.
ExprT::MaskPixelT MaskPixelT
SinglePixel< ImagePixelT, MaskPixelT, VariancePixelT > expr_type
exprTraits< double >::MaskPixelT MaskPixelT
A base class for image defects.
Calculate the variance when we divide two Pixels.
T1 operator()(T1 const &, T1 const &y, T1 const &vx) const
SinglePixel(rhsExpr const &rhs, typename std::enable_if<!std::is_fundamental< rhsExpr >::value, void *>::type dummy=nullptr)
size_t operator()(argument_type const &obj) const noexcept
variance_plus_covar(double alpha=0)
T1 operator()(T1 const &, T1 const &, T1 const &vx, T1 const &vy) const
MaskPixelT mask() const
Return the mask part of a Pixel.
ExprT1 plus(ExprT1 &lhs, ExprT2 const &rhs, float covariance)
Like operator+(), but assume that covariance's 2*alpha*sqrt(vx*vy)
T1 operator()(const T1 &x) const
ImagePixelT image() const
Return the image part of a Pixel.
BinaryExpr(ExprT1 e1, double e2, double const alpha, ImageBinOp imageOp=ImageBinOp(), MaskBinOp maskOp=MaskBinOp(), VarianceBinOp=VarianceBinOp())
A binary operation, with three functors to represent the image/mask/variance operations and an extra ...
friend Pixel operator-=(Pixel const &e1, ExprT const &e2)
Evaluate e1 -= e2, and return e1.
Pixel operator=(rhsExpr const &rhs)
Assign a Pixel by evaluating an expression.
exprTraits< ExprT1 >::MaskPixelT MaskPixelT
size_t operator()(argument_type const &obj) const noexcept
ExprT1 operator*=(ExprT1 &e1, ExprT2 e2)
Template to evaluate e1 *= e2.
std::size_t hash_value() const noexcept
Return a hash of this object.
ExprT1 operator/=(ExprT1 &e1, ExprT2 e2)
Template to evaluate e1 /= e2.
T1 operator()(T1 const &, T1 const &y, T1 const &vx) const
_VariancePixelT VariancePixelT
VariancePixelT variance() const
evaluate the variance part of the expression
A pixel of a MaskedImage.
SinglePixel(ImagePixelT image, MaskPixelT mask=0, VariancePixelT variance=0)
exprTraits< double >::VariancePixelT VariancePixelT
The variance of the sum of a pair of correlated pixels.
exprTraits< ExprT1 >::VariancePixelT VariancePixelT
friend Pixel operator*=(Pixel const &e1, ExprT const &e2)
Evaluate e1 *= e2, and return e1.
exprTraits< ExprT1 >::ImagePixelT ImagePixelT
VariancePixelT variance() const
evaluate the variance part of the expression
VariancePixelT variance() const
evaluate the variance part of the expression
exprTraits< double >::VariancePixelT VariancePixelT
Pixel operator=(Pixel const &rhs)
T1 operator()(const T1 &x, const T1 &y) const
A traits class to return the types of the image/mask/variance.
exprTraits< ExprT1 >::MaskPixelT MaskPixelT
table::PointKey< int > pixel
exprTraits< ExprT1 >::ImagePixelT ImagePixelT
ImagePixelT image() const
evaluate the image part of the expression
std::size_t hashCombine(std::size_t seed) noexcept
Combine hashes.
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects...
T1 operator()(T1 const &, T1 const &, T1 const &vx, T1 const &vy) const
SinglePixel< _ImagePixelT, _MaskPixelT, _VariancePixelT > PixelT
Pixel(SinglePixel< ImagePixelT, MaskPixelT, VariancePixelT > &rhs)
ImagePixelT image() const
evaluate the image part of the expression
MaskPixelT mask() const
evaluate the mask part of the expression
exprTraits< double >::MaskPixelT MaskPixelT
Class for representing Unary operations.
Calculate the variance when we multiply two Pixels.
A class used to identify classes that represent MaskedImage pixels.
UnaryExpr< ExprT1, std::negate< typename exprTraits< ExprT1 >::ImagePixelT >, noop< typename exprTraits< ExprT1 >::MaskPixelT >, noop< typename exprTraits< ExprT1 >::VariancePixelT > > operator-(ExprT1 e1)
Template for -e1.
ExprT::VariancePixelT VariancePixelT
BinaryExpr< ExprT1, ExprT2, std::plus< typename exprTraits< ExprT1 >::ImagePixelT >, bitwise_or< typename exprTraits< ExprT1 >::MaskPixelT >, variance_plus< typename exprTraits< ExprT1 >::VariancePixelT > > operator+(ExprT1 e1, ExprT2 e2)
Template for (e1 + e2)
static const PixelT padValue()
The quantity to use when a pixel value is undefined.
ExprT1 operator+=(ExprT1 &e1, ExprT2 e2)
template for e1 += e2
exprTraits< ExprT1 >::ImagePixelT ImagePixelT
Calculate the variance when we add (or subtract) two Pixels.
A noop functor (useful for e.g. masks and variances when changing the sign of the image) ...
SinglePixel< ImagePixelT, MaskPixelT, VariancePixelT > expr_type
friend bool operator==(Pixel const &lhs, T1 const &rhs)
Return true iff two pixels are equal (in all three of image, mask, and variance)
exprTraits< ExprT1 >::VariancePixelT VariancePixelT
exprTraits< double >::VariancePixelT VariancePixelT
_VariancePixelT VariancePixelT
friend Pixel operator+=(Pixel const &e1, ExprT const &e2)
Evaluate e1 += e2, and return e1.
friend class Pixel
Typedefs to be used for pixel values.