LSSTApplications  20.0.0
LSSTDataManagementBasePackage
Convolve.h
Go to the documentation of this file.
1 // -*- LSST-C++ -*-
2 
3 /*
4  * LSST Data Management System
5  * Copyright 2008, 2009, 2010 LSST Corporation.
6  *
7  * This product includes software developed by the
8  * LSST Project (http://www.lsst.org/).
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the LSST License Statement and
21  * the GNU General Public License along with this program. If not,
22  * see <http://www.lsstcorp.org/LegalNotices/>.
23  */
24 
25 #ifndef LSST_AFW_MATH_DETAIL_CONVOLVE_H
26 #define LSST_AFW_MATH_DETAIL_CONVOLVE_H
27 /*
28  * Convolution support
29  */
30 #include <memory>
31 #include <sstream>
32 
33 #include "lsst/pex/exceptions.h"
34 #include "lsst/afw/geom.h"
35 #include "lsst/afw/image/Image.h"
37 #include "lsst/afw/math/Kernel.h"
39 
40 #define IS_INSTANCE(A, B) (dynamic_cast<B const*>(&(A)) != NULL)
41 
42 namespace lsst {
43 namespace afw {
44 namespace math {
45 
46 namespace detail {
67 template <typename OutImageT, typename InImageT>
68 void basicConvolve(OutImageT& convolvedImage, InImageT const& inImage, lsst::afw::math::Kernel const& kernel,
69  lsst::afw::math::ConvolutionControl const& convolutionControl);
70 
79 template <typename OutImageT, typename InImageT>
80 void basicConvolve(OutImageT& convolvedImage, InImageT const& inImage,
82  lsst::afw::math::ConvolutionControl const& convolutionControl);
83 
105 template <typename OutImageT, typename InImageT>
106 void basicConvolve(OutImageT& convolvedImage, InImageT const& inImage,
108  lsst::afw::math::ConvolutionControl const& convolutionControl);
109 
118 template <typename OutImageT, typename InImageT>
119 void basicConvolve(OutImageT& convolvedImage, InImageT const& inImage,
120  lsst::afw::math::SeparableKernel const& kernel,
121  lsst::afw::math::ConvolutionControl const& convolutionControl);
122 
146 template <typename OutImageT, typename InImageT>
147 void convolveWithBruteForce(OutImageT& convolvedImage, InImageT const& inImage,
148  lsst::afw::math::Kernel const& kernel,
149  lsst::afw::math::ConvolutionControl const& convolutionControl);
150 
151 // I would prefer this to be nested in KernelImagesForRegion but SWIG doesn't support that
153 
173 public:
178 
193 
206  lsst::geom::Point2I const& xy0, bool doNormalize);
228  lsst::geom::Point2I const& xy0, bool doNormalize, ImagePtr bottomLeftImagePtr,
229  ImagePtr bottomRightImagePtr, ImagePtr topLeftImagePtr, ImagePtr topRightImagePtr);
230 
234  lsst::geom::Box2I getBBox() const { return _bbox; };
238  lsst::geom::Point2I getXY0() const { return _xy0; };
242  bool getDoNormalize() const { return _doNormalize; };
250  ImagePtr getImage(Location location) const;
254  KernelConstPtr getKernel() const { return _kernelPtr; };
273  bool computeNextRow(RowOfKernelImagesForRegion& regionRow) const;
274 
278  static int getMinInterpolationSize() { return _MinInterpolationSize; };
279 
280 private:
281  typedef std::vector<Location> LocationList;
282 
288  void _computeImage(Location location) const;
289  inline void _insertImage(Location location, ImagePtr imagePtr) const;
303  void _moveUp(bool isFirst, int newHeight);
304 
305  // static helper functions
306  static inline int _computeNextSubregionLength(int length, int nDivisions);
317  static std::vector<int> _computeSubregionLengths(int length, int nDivisions);
318 
319  // member variables
320  KernelConstPtr _kernelPtr;
321  lsst::geom::Box2I _bbox;
322  lsst::geom::Point2I _xy0;
323  bool _doNormalize;
324  mutable std::vector<ImagePtr> _imagePtrList;
325 
326  static int const _MinInterpolationSize;
327 };
328 
335 public:
337  typedef RegionList::iterator Iterator;
338  typedef RegionList::const_iterator ConstIterator;
339 
346  RowOfKernelImagesForRegion(int nx, int ny);
350  RegionList::const_iterator begin() const { return _regionList.begin(); };
354  RegionList::const_iterator end() const { return _regionList.end(); };
358  RegionList::iterator begin() { return _regionList.begin(); };
362  RegionList::iterator end() { return _regionList.end(); };
370  std::shared_ptr<KernelImagesForRegion> back() { return _regionList.back(); };
371  int getNX() const { return _nx; };
372  int getNY() const { return _ny; };
373  int getYInd() const { return _yInd; };
379  std::shared_ptr<KernelImagesForRegion const> getRegion(int ind) const { return _regionList.at(ind); };
380  bool hasData() const { return static_cast<bool>(_regionList[0]); };
381  bool isLastRow() const { return _yInd + 1 >= _ny; };
382  int incrYInd() { return ++_yInd; };
383 
384 private:
385  int _nx;
386  int _ny;
387  int _yInd;
388  RegionList _regionList;
389 };
390 
410 template <typename OutImageT, typename InImageT>
411 void convolveWithInterpolation(OutImageT& outImage, InImageT const& inImage,
412  lsst::afw::math::Kernel const& kernel,
413  ConvolutionControl const& convolutionControl);
414 
419 public:
434 };
435 
448 template <typename OutImageT, typename InImageT>
449 void convolveRegionWithInterpolation(OutImageT& outImage, InImageT const& inImage,
450  KernelImagesForRegion const& region,
452 
453 /*
454  * Define inline functions
455  */
456 
464 inline int KernelImagesForRegion::_computeNextSubregionLength(
465  int length,
466  int nDivisions)
467 {
468  return static_cast<int>(
469  std::floor(0.5 + (static_cast<double>(length) / static_cast<double>(nDivisions))));
470 }
471 
478 inline void KernelImagesForRegion::_insertImage(Location location,
479  ImagePtr imagePtr)
480  const {
481  if (imagePtr) {
482  if (_kernelPtr->getDimensions() != imagePtr->getDimensions()) {
484  os << "image dimensions = ( " << imagePtr->getWidth() << ", " << imagePtr->getHeight() << ") != ("
485  << _kernelPtr->getWidth() << ", " << _kernelPtr->getHeight() << ") = kernel dimensions";
487  }
488  _imagePtrList[location] = imagePtr;
489  }
490 }
491 } // namespace detail
492 } // namespace math
493 } // namespace afw
494 } // namespace lsst
495 
496 #endif // !defined(LSST_AFW_MATH_DETAIL_CONVOLVE_H)
std::floor
T floor(T... args)
lsst::afw::math::detail::ConvolveWithInterpolationWorkingImages::leftDeltaImage
Image leftDeltaImage
Definition: Convolve.h:430
lsst::afw::math::detail::RowOfKernelImagesForRegion::front
std::shared_ptr< KernelImagesForRegion > front()
Return the first region in the list.
Definition: Convolve.h:366
lsst::afw::math::detail::RowOfKernelImagesForRegion::getNX
int getNX() const
Definition: Convolve.h:371
lsst::afw::math::detail::RowOfKernelImagesForRegion
A row of KernelImagesForRegion.
Definition: Convolve.h:334
std::shared_ptr
STL class.
lsst::afw::math::Kernel::getDimensions
lsst::geom::Extent2I const getDimensions() const
Return the Kernel's dimensions (width, height)
Definition: Kernel.h:213
lsst::afw::math::DeltaFunctionKernel
A kernel that has only one non-zero pixel (of value 1)
Definition: Kernel.h:690
lsst::afw::math::detail::KernelImagesForRegion::ImagePtr
std::shared_ptr< Image > ImagePtr
Definition: Convolve.h:176
lsst::afw::math::Kernel::getHeight
int getHeight() const
Return the Kernel's height.
Definition: Kernel.h:230
lsst::afw::math::detail::KernelImagesForRegion::getBBox
lsst::geom::Box2I getBBox() const
Get the bounding box for the region.
Definition: Convolve.h:234
lsst::afw::math::detail::KernelImagesForRegion::TOP_RIGHT
@ TOP_RIGHT
Definition: Convolve.h:192
MaskedImage.h
lsst::afw::math::detail::KernelImagesForRegion::BOTTOM_RIGHT
@ BOTTOM_RIGHT
Definition: Convolve.h:192
std::vector
STL class.
lsst::afw::math::detail::ConvolveWithInterpolationWorkingImages::deltaImage
Image deltaImage
Definition: Convolve.h:432
lsst::afw::math::detail::KernelImagesForRegion::getKernel
KernelConstPtr getKernel() const
Get the kernel (as a shared pointer to const)
Definition: Convolve.h:254
lsst::afw::math::detail::RowOfKernelImagesForRegion::RowOfKernelImagesForRegion
RowOfKernelImagesForRegion(int nx, int ny)
Construct a RowOfKernelImagesForRegion.
Definition: KernelImagesForRegion.cc:227
lsst::afw::math::detail::KernelImagesForRegion::ImageConstPtr
std::shared_ptr< Image const > ImageConstPtr
Definition: Convolve.h:177
lsst::afw
Definition: imageAlgorithm.dox:1
lsst::afw::math::detail::ConvolveWithInterpolationWorkingImages
kernel images used by convolveRegionWithInterpolation
Definition: Convolve.h:418
lsst::afw::math::detail::KernelImagesForRegion::TOP_LEFT
@ TOP_LEFT
Definition: Convolve.h:192
std::vector::back
T back(T... args)
geom.h
Image.h
std::vector::front
T front(T... args)
lsst::afw::math::detail::KernelImagesForRegion::getPixelIndex
lsst::geom::Point2I getPixelIndex(Location location) const
Compute pixel index of a given location, relative to the parent image (thus offset by bottom left cor...
Definition: KernelImagesForRegion.cc:92
lsst::afw::math::detail::KernelImagesForRegion::BOTTOM_LEFT
@ BOTTOM_LEFT
Definition: Convolve.h:192
lsst::afw::math::detail::RowOfKernelImagesForRegion::end
RegionList::iterator end()
Return the end iterator for the list.
Definition: Convolve.h:362
lsst::afw::math::detail::KernelImagesForRegion::Location
Location
locations of various points in the region
Definition: Convolve.h:192
lsst::afw::math::detail::RowOfKernelImagesForRegion::end
RegionList::const_iterator end() const
Return the end iterator for the list.
Definition: Convolve.h:354
lsst::afw::math::detail::RowOfKernelImagesForRegion::Iterator
RegionList::iterator Iterator
Definition: Convolve.h:337
std::vector::at
T at(T... args)
lsst::afw::math::detail::RowOfKernelImagesForRegion::getYInd
int getYInd() const
Definition: Convolve.h:373
lsst::afw::math::detail::KernelImagesForRegion::getMinInterpolationSize
static int getMinInterpolationSize()
Get the minInterpolationSize class constant.
Definition: Convolve.h:278
lsst::afw::math::detail::RowOfKernelImagesForRegion::begin
RegionList::iterator begin()
Return the begin iterator for the list.
Definition: Convolve.h:358
lsst::afw::math::LinearCombinationKernel
A kernel that is a linear combination of fixed basis kernels.
Definition: Kernel.h:751
lsst::afw::math::detail::convolveWithBruteForce
void convolveWithBruteForce(OutImageT &convolvedImage, InImageT const &inImage, lsst::afw::math::Kernel const &kernel, lsst::afw::math::ConvolutionControl const &convolutionControl)
Convolve an Image or MaskedImage with a Kernel by computing the kernel image at every point.
Definition: BasicConvolve.cc:356
lsst::afw::math::detail::KernelImagesForRegion::Image
lsst::afw::image::Image< lsst::afw::math::Kernel::Pixel > Image
Definition: Convolve.h:175
lsst::afw::math::detail::RowOfKernelImagesForRegion::ConstIterator
RegionList::const_iterator ConstIterator
Definition: Convolve.h:338
lsst::afw::math::detail::RowOfKernelImagesForRegion::back
std::shared_ptr< KernelImagesForRegion > back()
Return the last region in the list.
Definition: Convolve.h:370
lsst::afw::math::detail::RowOfKernelImagesForRegion::getNY
int getNY() const
Definition: Convolve.h:372
lsst::afw::math::detail::ConvolveWithInterpolationWorkingImages::Image
lsst::afw::image::Image< lsst::afw::math::Kernel::Pixel > Image
Definition: Convolve.h:420
lsst::afw::math::detail::ConvolveWithInterpolationWorkingImages::rightDeltaImage
Image rightDeltaImage
Definition: Convolve.h:431
lsst::afw::math::detail::RowOfKernelImagesForRegion::begin
RegionList::const_iterator begin() const
Return the begin iterator for the list.
Definition: Convolve.h:350
dimensions
afw::table::PointKey< int > dimensions
Definition: GaussianPsf.cc:49
lsst::afw::math::detail::RowOfKernelImagesForRegion::incrYInd
int incrYInd()
Definition: Convolve.h:382
lsst::afw::math::Kernel::getWidth
int getWidth() const
Return the Kernel's width.
Definition: Kernel.h:225
lsst
A base class for image defects.
Definition: imageAlgorithm.dox:1
LSST_EXCEPT
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition: Exception.h:48
lsst::afw::math::detail::KernelImagesForRegion::getDoNormalize
bool getDoNormalize() const
Get the doNormalize parameter.
Definition: Convolve.h:242
std::ostringstream
STL class.
lsst::afw::math::detail::KernelImagesForRegion::getImage
ImagePtr getImage(Location location) const
Return the image and sum at the specified location.
Definition: KernelImagesForRegion.cc:81
os
std::ostream * os
Definition: Schema.cc:746
lsst::afw::math::detail::KernelImagesForRegion::getXY0
lsst::geom::Point2I getXY0() const
Get xy0 of the image.
Definition: Convolve.h:238
lsst::afw::math::detail::KernelImagesForRegion::computeNextRow
bool computeNextRow(RowOfKernelImagesForRegion &regionRow) const
Compute next row of subregions.
Definition: KernelImagesForRegion.cc:114
lsst::afw::math::detail::ConvolveWithInterpolationWorkingImages::kernelImage
Image kernelImage
Definition: Convolve.h:433
lsst::afw::math::ConvolutionControl
Parameters to control convolution.
Definition: ConvolveImage.h:50
lsst::pex::exceptions::InvalidParameterError
Reports invalid arguments.
Definition: Runtime.h:66
lsst::afw::math::detail::basicConvolve
void basicConvolve(OutImageT &convolvedImage, InImageT const &inImage, lsst::afw::math::Kernel const &kernel, lsst::afw::math::ConvolutionControl const &convolutionControl)
Low-level convolution function that does not set edge pixels.
Definition: BasicConvolve.cc:142
std::vector::begin
T begin(T... args)
Kernel.h
lsst::geom::Point< int, 2 >
lsst::geom::Box2I
An integer coordinate rectangle.
Definition: Box.h:55
lsst::afw::math::detail::KernelImagesForRegion
A collection of Kernel images for special locations on a rectangular region of an image.
Definition: Convolve.h:172
lsst::afw::math::detail::KernelImagesForRegion::KernelImagesForRegion
KernelImagesForRegion(KernelConstPtr kernelPtr, lsst::geom::Box2I const &bbox, lsst::geom::Point2I const &xy0, bool doNormalize)
Construct a KernelImagesForRegion.
Definition: KernelImagesForRegion.cc:49
lsst::afw::math::detail::RowOfKernelImagesForRegion::getRegion
std::shared_ptr< KernelImagesForRegion const > getRegion(int ind) const
get the specified region (range-checked)
Definition: Convolve.h:379
lsst::afw::math::detail::RowOfKernelImagesForRegion::isLastRow
bool isLastRow() const
Definition: Convolve.h:381
lsst::afw::math::detail::ConvolveWithInterpolationWorkingImages::rightImage
Image rightImage
Definition: Convolve.h:429
lsst::afw::math::Kernel
Kernels are used for convolution with MaskedImages and (eventually) Images.
Definition: Kernel.h:111
lsst::afw::math::detail::ConvolveWithInterpolationWorkingImages::ConvolveWithInterpolationWorkingImages
ConvolveWithInterpolationWorkingImages(lsst::geom::Extent2I const &dimensions)
Definition: Convolve.h:421
std::vector::end
T end(T... args)
lsst::afw::math::detail::KernelImagesForRegion::KernelConstPtr
std::shared_ptr< lsst::afw::math::Kernel const > KernelConstPtr
Definition: Convolve.h:174
lsst::afw::image::Image< lsst::afw::math::Kernel::Pixel >
astshim.fitsChanContinued.length
def length(self)
Definition: fitsChanContinued.py:81
ConvolveImage.h
lsst::afw::math::detail::ConvolveWithInterpolationWorkingImages::leftImage
Image leftImage
Definition: Convolve.h:428
lsst::geom::Extent< int, 2 >
lsst::afw::math::detail::RowOfKernelImagesForRegion::RegionList
std::vector< std::shared_ptr< KernelImagesForRegion > > RegionList
Definition: Convolve.h:336
lsst::afw::math::SeparableKernel
A kernel described by a pair of functions: func(x, y) = colFunc(x) * rowFunc(y)
Definition: Kernel.h:907
lsst::afw::math::detail::RowOfKernelImagesForRegion::hasData
bool hasData() const
Definition: Convolve.h:380
lsst::afw::math::detail::convolveRegionWithInterpolation
void convolveRegionWithInterpolation(OutImageT &outImage, InImageT const &inImage, KernelImagesForRegion const &region, ConvolveWithInterpolationWorkingImages &workingImages)
Convolve a region of an Image or MaskedImage with a spatially varying Kernel using interpolation.
Definition: ConvolveWithInterpolation.cc:94
exceptions.h
bbox
AmpInfoBoxKey bbox
Definition: Amplifier.cc:117
lsst::afw::math::detail::convolveWithInterpolation
void convolveWithInterpolation(OutImageT &outImage, InImageT const &inImage, lsst::afw::math::Kernel const &kernel, ConvolutionControl const &convolutionControl)
Convolve an Image or MaskedImage with a spatially varying Kernel using linear interpolation.
Definition: ConvolveWithInterpolation.cc:50