38namespace ex = pex::exceptions;
62 bool const haveDefault = !
std::isnan(defaultValue);
64 for (std::vector<double>::const_iterator pVal = values.
begin(), pRef = refs.
begin(); pRef != refs.
end();
69 }
else if (haveDefault) {
79template <
typename ImageT>
92 for (
int iX = 0; iX < nxSample; ++iX) {
93 for (
int iY = 0; iY < nySample; ++iY) {
94 ImageT subimg = ImageT(img,
102 im(iX, iY) = res.first;
103 var(iX, iY) = res.second;
109 :
Background(imageBBox, statsImage.getWidth(), statsImage.getHeight()), _statsImage(statsImage) {}
117 _gridColumns[iX].
resize(height);
127 cullNan(
_ycen, _grid, ycenTmp, gridTmp);
133 switch (undersampleStyle) {
138 if (gridTmp.
empty()) {
151 e,
"The BackgroundControl UndersampleStyle INCREASE_NXNYSAMPLE is not supported.");
155 "UndersampleStyle %d is not defined.") %
164 for (
int iY = 0; iY < height; ++iY) {
165 _gridColumns[iX][iY] = intobj->interpolate(ypix[iY]);
170 _statsImage += delta;
175 _statsImage -= delta;
179template <
typename PixelT>
188 str(boost::format(
"BBox (%d:%d,%d:%d) out of range (%d:%d,%d:%d)") %
bbox.getMinX() %
192 int const nxSample = _statsImage.
getWidth();
193 int const nySample = _statsImage.
getHeight();
212 switch (undersampleStyle) {
214 if (isXundersampled && isYundersampled) {
217 "nxSample and nySample have too few points for requested interpolation style.");
218 }
else if (isXundersampled) {
220 "nxSample has too few points for requested interpolation style.");
221 }
else if (isYundersampled) {
223 "nySample has too few points for requested interpolation style.");
227 if (isXundersampled || isYundersampled) {
230 interpStyle = (nxSample < nySample) ? xStyle : yStyle;
235 if (isXundersampled || isYundersampled) {
238 "The BackgroundControl UndersampleStyle INCREASE_NXNYSAMPLE is not supported.");
243 str(boost::format(
"The selected BackgroundControl "
244 "UndersampleStyle %d is not defined.") %
262 for (
int iY = 0; iY < height; ++iY) {
266 _gridColumns.
resize(width);
267 for (
int iX = 0; iX < nxSample; ++iX) {
268 _setGridColumns(interpStyle, undersampleStyle, iX, ypix);
287 for (
int y = 0, iY = bboxOff.getY();
y <
bbox.getHeight(); ++
y, ++iY) {
290 for (
int iX = 0; iX < nxSample; iX++) {
291 bg_x[iX] =
static_cast<double>(_gridColumns[iX][iY]);
293 cullNan(
_xcen, bg_x, xcenTmp, bgTmp, defaultValue);
298 }
catch (pex::exceptions::OutOfRangeError& e) {
299 switch (undersampleStyle) {
301 LSST_EXCEPT_ADD(e, str(boost::format(
"Interpolating in y (iY = %d)") % iY));
305 xcenTmp.push_back(0);
306 bgTmp.push_back(defaultValue);
317 "The BackgroundControl UndersampleStyle INCREASE_NXNYSAMPLE is not supported.");
321 "UndersampleStyle %d is not defined.") %
326 LSST_EXCEPT_ADD(e, str(boost::format(
"Interpolating in y (iY = %d)") % iY));
331 for (
int iX = bboxOff.getX(),
x = 0;
x <
bbox.getWidth(); ++iX, ++
x) {
332 (*bg)(
x,
y) =
static_cast<PixelT>(intobj->interpolate(iX));
335 bg->setXY0(
bbox.getMin());
340template <
typename PixelT>
342 ApproximateControl
const& actrl,
343 UndersampleStyle
const undersampleStyle
354#define CREATE_BACKGROUND(m, v, TYPE) \
355 template BackgroundMI::BackgroundMI(image::Image<TYPE> const& img, BackgroundControl const& bgCtrl); \
356 template BackgroundMI::BackgroundMI(image::MaskedImage<TYPE> const& img, \
357 BackgroundControl const& bgCtrl); \
358 std::shared_ptr<image::Image<TYPE>> BackgroundMI::_getImage( \
359 lsst::geom::Box2I const& bbox, \
360 Interpolate::Style const interpStyle, \
361 UndersampleStyle const undersampleStyle, \
364 return BackgroundMI::doGetImage<TYPE>(bbox, interpStyle, undersampleStyle); \
367#define CREATE_getApproximate(m, v, TYPE) \
368 std::shared_ptr<Approximate<TYPE>> BackgroundMI::_getApproximate( \
369 ApproximateControl const& actrl, \
370 UndersampleStyle const undersampleStyle, \
373 return BackgroundMI::doGetApproximate<TYPE>(actrl, undersampleStyle); \
#define LSST_makeBackground_getApproximate_types
#define LSST_makeBackground_getImage_types
#define LSST_EXCEPT_ADD(e, m)
Add the current location and a message to an existing exception before rethrowing it.
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
y_iterator col_begin(int x) const
Return an y_iterator to the start of the y'th row.
y_iterator col_end(int x) const
Return an y_iterator to the start of the y'th row.
A class to manipulate images, masks, and variance as a single object.
int getHeight() const
Return the number of rows in the image.
int getWidth() const
Return the number of columns in the image.
VariancePtr getVariance() const
Return a (shared_ptr to) the MaskedImage's variance.
ImagePtr getImage() const
Return a (shared_ptr to) the MaskedImage's image.
Pass parameters to a Background object.
std::shared_ptr< StatisticsControl > getStatisticsControl()
Property getStatisticsProperty() const
A virtual base class to evaluate image background levels.
std::vector< double > _ycen
y center ...
std::vector< double > _xcen
x center pix coords of sub images
std::vector< int > _xsize
x size of sub images
lsst::geom::Box2I _imgBBox
size and origin of input image
std::vector< int > _xorig
x origin pix coords of sub images
UndersampleStyle _asUsedUndersampleStyle
the undersampleStyle we actually used
std::vector< int > _ysize
y size ...
float InternalPixelT
type used for any internal images, and returned by getApproximate
std::vector< int > _yorig
y origin ...
Interpolate::Style _asUsedInterpStyle
the style we actually used
std::shared_ptr< BackgroundControl > _bctrl
control info set by user.
A class to evaluate image background levels.
BackgroundMI & operator-=(float const delta) override
Subtract a scalar from the Background (equivalent to subtracting a constant from the original image)
BackgroundMI & operator+=(float const delta) override
Add a scalar to the Background (equivalent to adding a constant to the original image)
BackgroundMI(ImageT const &img, BackgroundControl const &bgCtrl)
Constructor for BackgroundMI.
Value getResult(Property const prop=NOTHING) const
Return the value and error in the specified statistic (e.g.
An integer coordinate rectangle.
int getMinY() const noexcept
int getHeight() const noexcept
Point2I const getMin() const noexcept
int getMinX() const noexcept
int getWidth() const noexcept
int getMaxX() const noexcept
bool contains(Point2I const &point) const noexcept
Return true if the box contains the point.
int getMaxY() const noexcept
Extent2I const getDimensions() const noexcept
Provides consistent interface for LSST exceptions.
Reports invalid arguments.
Reports attempts to exceed implementation-defined length limits for some classes.
Reports attempts to access elements outside a valid range of indices.
Interpolate::Style lookupMaxInterpStyle(int const n)
Get the highest order Interpolation::Style available for 'n' points.
Statistics makeStatistics(lsst::afw::image::Image< Pixel > const &img, lsst::afw::image::Mask< image::MaskPixel > const &msk, int const flags, StatisticsControl const &sctrl=StatisticsControl())
Handle a watered-down front-end to the constructor (no variance)
@ ERRORS
Include errors of requested quantities.
int lookupMinInterpPoints(Interpolate::Style const style)
Get the minimum number of points needed to use the requested interpolation style.
std::shared_ptr< Interpolate > makeInterpolate(std::vector< double > const &x, std::vector< double > const &y, Interpolate::Style const style=Interpolate::AKIMA_SPLINE)
A factory function to make Interpolate objects.
std::shared_ptr< Approximate< PixelT > > makeApproximate(std::vector< double > const &x, std::vector< double > const &y, image::MaskedImage< PixelT > const &im, lsst::geom::Box2I const &bbox, ApproximateControl const &ctrl)
Construct a new Approximate object, inferring the type from the type of the given MaskedImage.
BOOST_PP_SEQ_FOR_EACH(INSTANTIATE_COLUMNVIEW_SCALAR, _, BOOST_PP_TUPLE_TO_SEQ(AFW_TABLE_SCALAR_FIELD_TYPE_N, AFW_TABLE_SCALAR_FIELD_TYPE_TUPLE)) BOOST_PP_SEQ_FOR_EACH(INSTANTIATE_COLUMNVIEW_ARRAY