23#if !defined(LSST_AFW_IMAGE_PIXEL_H)
24#define LSST_AFW_IMAGE_PIXEL_H
38template <
typename,
typename,
typename,
typename,
typename>
72template <
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()
118template <
typename PixelT>
127template <
typename _ImagePixelT,
typename _MaskPixelT,
typename _VariancePixelT>
140template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
147template <
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>
292template <
typename ExprT>
337template <
typename T1>
347template <
typename T1>
358template <
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); }
375template <
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; }
391template <
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; }
405template <
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; }
419template <
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;
447template <
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;
486template <
typename ExprT1,
typename ImageBinOp,
typename MaskBinOp,
typename VarianceBinOp>
487class 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)) {}
516 VarianceBinOp _varOp;
520template <
typename ExprT1>
521UnaryExpr<ExprT1, std::negate<typename exprTraits<ExprT1>::ImagePixelT>,
522 noop<typename exprTraits<ExprT1>::MaskPixelT>, noop<typename exprTraits<ExprT1>::VariancePixelT> >
531template <
class T,
template <
class...>
class Template>
534template <
template <
class...>
class Template,
class... Args>
537template <
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>{} )
550BinaryExpr<ExprT1, ExprT2,
std::plus<
typename exprTraits<ExprT1>::ImagePixelT>,
551 bitwise_or<
typename exprTraits<ExprT1>::MaskPixelT>,
552 variance_plus<
typename exprTraits<ExprT1>::VariancePixelT> >
553operator+(ExprT1 e1, ExprT2 e2) {
560template <
typename ExprT1,
typename ExprT2>
573template <
typename ExprT1,
typename ExprT2>
574ExprT1 doPlus(ExprT1 e1, ExprT2 e2,
double const, boost::mpl::true_) {
578template <
typename ExprT1,
typename ExprT2>
579BinaryExpr<ExprT1, ExprT2, std::plus<typename exprTraits<ExprT1>::ImagePixelT>,
580 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
581 variance_plus_covar<typename exprTraits<ExprT1>::VariancePixelT> >
582doPlus(ExprT1 e1, ExprT2 e2,
double const alpha, boost::mpl::false_) {
583 return BinaryExpr<ExprT1, ExprT2, std::plus<typename exprTraits<ExprT1>::ImagePixelT>,
584 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
585 variance_plus_covar<typename exprTraits<ExprT1>::VariancePixelT> >(e1, e2, alpha);
590template <
typename ExprT1,
typename ExprT2>
601template <
typename ExprT1,
typename ExprT2>
602BinaryExpr<ExprT1, ExprT2, std::minus<typename exprTraits<ExprT1>::ImagePixelT>,
603 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
604 variance_plus<typename exprTraits<ExprT1>::VariancePixelT> >
612template <
typename ExprT1,
typename ExprT2>
622template <
typename ExprT1,
typename ExprT2>
623BinaryExpr<ExprT1, ExprT2, std::multiplies<typename exprTraits<ExprT1>::ImagePixelT>,
624 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
625 variance_multiplies<typename exprTraits<ExprT1>::VariancePixelT> >
633template <
typename ExprT1,
typename ExprT2>
643template <
typename ExprT1,
typename ExprT2>
644BinaryExpr<ExprT1, ExprT2, std::divides<typename exprTraits<ExprT1>::ImagePixelT>,
645 bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
646 variance_divides<typename exprTraits<ExprT1>::VariancePixelT> >
654template <
typename ExprT1,
typename ExprT2>
663template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
669template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
675template <
typename ExprT1,
typename ExprT2,
typename BinOp,
typename MaskBinOp,
typename VarBinOp>
685template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
686struct hash<
lsst::afw::image::pixel::Pixel<ImagePixelT, MaskPixelT, VariancePixelT>> {
697template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
698struct hash<
lsst::afw::image::pixel::SinglePixel<ImagePixelT, MaskPixelT, VariancePixelT>> {
705 ImagePixelT
image = obj.image();
706 MaskPixelT
mask = obj.mask();
707 VariancePixelT
variance = obj.variance();
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.
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.
ExprT1 operator+=(ExprT1 &e1, ExprT2 e2)
template for 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.
SinglePixel< ImagePixelT, MaskPixelT, VariancePixelT > makeSinglePixel(ImagePixelT x, MaskPixelT m, VariancePixelT v)
Return a SinglePixel.
ExprT1 operator-=(ExprT1 &e1, ExprT2 e2)
Template to evaluate e1 -= e2.
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)
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)
std::size_t hashCombine(std::size_t seed) noexcept
Combine hashes.
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