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>
104 : _image(
std::numeric_limits<_ImagePixelT>::has_quiet_NaN
105 ?
std::numeric_limits<_ImagePixelT>::quiet_NaN()
108 _variance(
std::numeric_limits<_VariancePixelT>::has_quiet_NaN
109 ?
std::numeric_limits<_VariancePixelT>::quiet_NaN()
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>
169 : _image(rhs._image), _mask(rhs._mask), _variance(rhs._variance) {}
178 _image = rhs.
image();
188 template <
typename rhsExpr>
190 _variance = rhs.variance();
191 _image = rhs.image();
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>
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) {}
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)) {}
471 return _varOp(_expr1.image(), _expr2.image(), _expr1.variance(), _expr2.variance());
479 VarianceBinOp _varOp;
486 template <
typename ExprT1,
typename ImageBinOp,
typename MaskBinOp,
typename VarianceBinOp>
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)) {}
516 VarianceBinOp _varOp;
520 template <
typename ExprT1>
522 noop<typename exprTraits<ExprT1>::MaskPixelT>, noop<typename exprTraits<ExprT1>::VariancePixelT> >
531 template <
class T,
template <
class...>
class Template>
534 template <
template <
class...>
class Template,
class... Args>
537 template <
typename ExprT1,
typename ExprT2,
538 typename = std::enable_if_t <
541 is_specialization<ExprT1,SinglePixel>{} ||
542 is_specialization<ExprT1,Pixel>{})
545 is_specialization<ExprT2,BinaryExpr>{} ||
546 is_specialization<ExprT2,SinglePixel>{} ||
547 is_specialization<ExprT2,Pixel>{} )
553 operator+(ExprT1 e1, ExprT2 e2) {
560 template <
typename ExprT1,
typename ExprT2>
573 template <
typename ExprT1,
typename ExprT2>
574 ExprT1 doPlus(ExprT1 e1, ExprT2 e2,
double const, boost::mpl::true_) {
578 template <
typename ExprT1,
typename ExprT2>
580 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
581 variance_plus_covar<typename exprTraits<ExprT1>::VariancePixelT> >
582 doPlus(ExprT1 e1, ExprT2 e2,
double const alpha, boost::mpl::false_) {
584 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
585 variance_plus_covar<typename exprTraits<ExprT1>::VariancePixelT> >(e1, e2, alpha);
590 template <
typename ExprT1,
typename ExprT2>
601 template <
typename ExprT1,
typename ExprT2>
603 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
604 variance_plus<typename exprTraits<ExprT1>::VariancePixelT> >
612 template <
typename ExprT1,
typename ExprT2>
622 template <
typename ExprT1,
typename ExprT2>
624 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
625 variance_multiplies<typename exprTraits<ExprT1>::VariancePixelT> >
633 template <
typename ExprT1,
typename ExprT2>
643 template <
typename ExprT1,
typename ExprT2>
645 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
646 variance_divides<typename exprTraits<ExprT1>::VariancePixelT> >
654 template <
typename ExprT1,
typename ExprT2>
663 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
669 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
675 template <
typename ExprT1,
typename ExprT2,
typename BinOp,
typename MaskBinOp,
typename VarBinOp>
685 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
697 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
698 struct hash<
lsst::afw::image::pixel::SinglePixel<ImagePixelT, MaskPixelT, VariancePixelT>> {
table::PointKey< int > pixel
VariancePixelT variance() const
evaluate the variance part of the expression
MaskPixelT mask() const
evaluate the mask part of the expression
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 ...
typename exprTraits< ExprT1 >::MaskPixelT MaskPixelT
ImagePixelT image() const
evaluate the image part of the expression
typename exprTraits< ExprT1 >::VariancePixelT VariancePixelT
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.
typename exprTraits< ExprT1 >::ImagePixelT ImagePixelT
Class for representing binary operations.
typename exprTraits< ExprT1 >::VariancePixelT VariancePixelT
ImagePixelT image() const
evaluate the image part of the expression
typename exprTraits< ExprT1 >::ImagePixelT ImagePixelT
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 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.
typename exprTraits< ExprT1 >::MaskPixelT MaskPixelT
VariancePixelT variance() const
evaluate the variance part of the expression
MaskPixelT mask() const
evaluate the mask part of the expression
A pixel of a MaskedImage.
MaskPixelT mask() const
Return the mask part of a Pixel.
Pixel(ImagePixelT const &image, MaskPixelT const &mask=0x0, VariancePixelT const &variance=0)
Construct a Pixel from references to its image/mask/variance components.
_VariancePixelT VariancePixelT
friend Pixel operator/=(Pixel const &e1, ExprT const &e2)
Evaluate e1 /= e2, and return e1.
Pixel operator=(Pixel const &rhs)
friend Pixel operator-=(Pixel const &e1, ExprT const &e2)
Evaluate e1 -= e2, and return e1.
Pixel(Pixel const &rhs)=default
ImagePixelT image() const
Return the image part of a Pixel.
Pixel(SinglePixel< ImagePixelT, MaskPixelT, VariancePixelT > &rhs)
friend bool operator==(Pixel const &lhs, T1 const &rhs)
Return true iff two pixels are equal (in all three of image, mask, and variance)
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.
friend Pixel operator+=(Pixel const &e1, ExprT const &e2)
Evaluate e1 += e2, and return e1.
std::size_t hash_value() const noexcept
Return a hash of this object.
Pixel operator=(double const &rhs_image)
set the image part of a Pixel to rhs_image (the mask and variance are set to 0)
Pixel operator=(int const &rhs_image)
set the image part of a Pixel to rhs_image (the mask and variance are set to 0)
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)
Pixel(Pixel &&rhs)=default
VariancePixelT variance() const
Return the variance part of a Pixel.
Pixel operator=(Pixel &&rhs)
A single pixel of the same type as a MaskedImage.
SinglePixel(rhsExpr const &rhs, typename std::enable_if<!std::is_fundamental< rhsExpr >::value, void * >::type dummy=nullptr)
VariancePixelT variance() const
SinglePixel(ImagePixelT image, MaskPixelT mask=0, VariancePixelT variance=0)
_VariancePixelT VariancePixelT
ImagePixelT image() const
Class for representing Unary operations.
VariancePixelT variance() const
evaluate the variance part of the expression
MaskPixelT mask() const
evaluate the mask part of the expression
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
typename exprTraits< ExprT1 >::ImagePixelT ImagePixelT
typename exprTraits< ExprT1 >::VariancePixelT VariancePixelT
ImagePixelT image() const
evaluate the image part of the expression
typename exprTraits< ExprT1 >::MaskPixelT MaskPixelT
ExprT1 operator*=(ExprT1 &e1, ExprT2 e2)
Template to evaluate e1 *= e2.
UnaryExpr< ExprT1, std::negate< typename exprTraits< ExprT1 >::ImagePixelT >, noop< typename exprTraits< ExprT1 >::MaskPixelT >, noop< typename exprTraits< ExprT1 >::VariancePixelT > > operator-(ExprT1 e1)
Template for -e1.
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)
ExprT1 operator/=(ExprT1 &e1, ExprT2 e2)
Template to evaluate e1 /= e2.
ExprT1 operator+=(ExprT1 &e1, ExprT2 e2)
template for e1 += e2
SinglePixel< ImagePixelT, MaskPixelT, VariancePixelT > makeSinglePixel(ImagePixelT x, MaskPixelT m, VariancePixelT v)
Return a SinglePixel.
std::ostream & operator<<(std::ostream &os, SinglePixel< ImagePixelT, MaskPixelT, VariancePixelT > const &v)
Print a SinglePixel.
ExprT1 operator-=(ExprT1 &e1, ExprT2 e2)
Template to evaluate e1 -= e2.
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)
ExprT1 plus(ExprT1 &lhs, ExprT2 const &rhs, float covariance)
Like operator+(), but assume that covariance's 2*alpha*sqrt(vx*vy)
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects.
class[[deprecated("Removed with no replacement (but see lsst::afw::image::TransmissionCurve). Will be " "removed after v22.")]] FilterProperty final
Describe the properties of a Filter (e.g.
std::size_t hashCombine(std::size_t seed) noexcept
Combine hashes.
float Pixel
Typedefs to be used for pixel values.
A base class for image defects.
A class used to identify classes that represent MaskedImage pixels.
static const PixelT padValue()
The quantity to use when a pixel value is undefined.
static const PixelT padValue()
The quantity to use when a pixel value is undefined.
bitwise_or doesn't seem to be in std::
T1 operator()(const T1 &x, const T1 &y) const
T1 operator()(const T1 &x) const
exprTraits< double >::VariancePixelT VariancePixelT
exprTraits< double >::MaskPixelT MaskPixelT
exprTraits< double >::VariancePixelT VariancePixelT
exprTraits< double >::MaskPixelT MaskPixelT
exprTraits< double >::VariancePixelT VariancePixelT
exprTraits< double >::MaskPixelT MaskPixelT
A traits class to return the types of the image/mask/variance.
typename ExprT::ImagePixelT ImagePixelT
typename ExprT::MaskPixelT MaskPixelT
typename ExprT::VariancePixelT VariancePixelT
A noop functor (useful for e.g. masks and variances when changing the sign of the image)
T1 operator()(const T1 &x) const
Calculate the variance when we divide two Pixels.
T1 operator()(T1 const &, T1 const &y, T1 const &vx) const
T1 operator()(T1 const &x, T1 const &y, T1 const &vx, T1 const &vy) const
Calculate the variance when we multiply two Pixels.
T1 operator()(T1 const &x, T1 const &y, T1 const &vx, T1 const &vy) const
T1 operator()(T1 const &, T1 const &y, T1 const &vx) const
The variance of the sum of a pair of correlated pixels.
variance_plus_covar(double alpha=0)
T1 operator()(T1 const &, T1 const &, T1 const &vx) const
T1 operator()(T1 const &, T1 const &, T1 const &vx, T1 const &vy) const
Calculate the variance when we add (or subtract) two Pixels.
T1 operator()(T1 const &, T1 const &, T1 const &vx, T1 const &vy) const
T1 operator()(T1 const &, T1 const &, T1 const &vx) const
size_t operator()(argument_type const &obj) const noexcept
size_t operator()(argument_type const &obj) const noexcept