42 #include "boost/shared_ptr.hpp"
43 #include "boost/pointer_cast.hpp"
44 #include "boost/cstdint.hpp"
45 #include "boost/regex.hpp"
62 namespace pexExcept = lsst::pex::exceptions;
63 namespace pexLog = lsst::pex::logging;
65 namespace afwGeom = lsst::afw::geom;
66 namespace afwCoord = lsst::afw::coord;
67 namespace afwMath = lsst::afw::math;
85 throw LSST_EXCEPT(pexExcept::InvalidParameterError,
"bad ind argument in WarpingKernel::setKernelParameter()");
87 int ctr = p->
getCtr()[ind];
90 if (ctr == (size-1)/2) {
91 if (value < -1e-6 || value > 1+1e-6) {
92 throw LSST_EXCEPT(pexExcept::InvalidParameterError,
"bad coordinate in WarpingKernel::setKernelParameter()");
94 }
else if (ctr == (size+1)/2) {
95 if (value < -1-1e-6 || value > 1e-6) {
96 throw LSST_EXCEPT(pexExcept::InvalidParameterError,
"bad coordinate in WarpingKernel::setKernelParameter()");
99 throw LSST_EXCEPT(pexExcept::InvalidParameterError,
"bad ctr value in WarpingKernel::setKernelParameter()");
117 checkWarpingKernelParameter(
this, ind, value);
146 return 0.5 + (1.0 - (2.0 * fabs(this->_params[0]))) * (0.5 - fabs(x));
151 checkWarpingKernelParameter(
this, ind, value);
158 std::string afwMath::BilinearWarpingKernel::BilinearFunction1::toString(std::string
const& prefix)
const {
159 std::ostringstream os;
160 os <<
"_BilinearFunction1: ";
161 os << Function1<Kernel::Pixel>::toString(prefix);
178 return static_cast<double>((fabs(this->_params[0]) < 0.5) == (fabs(x) < 0.5));
183 checkWarpingKernelParameter(
this, ind, value);
190 std::string afwMath::NearestWarpingKernel::NearestFunction1::toString(std::string
const& prefix)
const {
191 std::ostringstream os;
192 os <<
"_NearestFunction1: ";
193 os << Function1<Kernel::Pixel>::toString(prefix);
198 typedef boost::shared_ptr<afwMath::SeparableKernel> KernelPtr;
199 boost::cmatch matches;
200 static const boost::regex LanczosRE(
"lanczos(\\d+)");
201 if (name ==
"bilinear") {
203 }
else if (boost::regex_match(name.c_str(), matches, LanczosRE)) {
204 std::string orderStr(matches[1].first, matches[1].second);
206 std::istringstream(orderStr) >> order;
208 }
else if (name ==
"nearest") {
211 throw LSST_EXCEPT(pexExcept::InvalidParameterError,
212 "unknown warping kernel name: \"" + name +
"\"");
217 if (_warpingKernelPtr->getCacheSize() != _cacheSize) {
218 _warpingKernelPtr->computeCache(_cacheSize);
220 return _warpingKernelPtr;
227 setWarpingKernel(*warpingKernelPtr);
233 if (_maskWarpingKernelPtr) {
234 _testWarpingKernels(warpingKernel, *_maskWarpingKernelPtr);
237 _testDevicePreference(_devicePreference, warpingKernelPtr);
238 _warpingKernelPtr = warpingKernelPtr;
243 if (_maskWarpingKernelPtr) {
244 if (_maskWarpingKernelPtr->getCacheSize() != _cacheSize) {
245 _maskWarpingKernelPtr->computeCache(_cacheSize);
248 return _maskWarpingKernelPtr;
252 std::string
const &maskWarpingKernelName
254 if (!maskWarpingKernelName.empty()) {
256 setMaskWarpingKernel(*maskWarpingKernelPtr);
258 _maskWarpingKernelPtr.reset();
265 _testWarpingKernels(*_warpingKernelPtr, maskWarpingKernel);
282 if (!kernelBBox.
contains(maskKernelBBox)) {
283 throw LSST_EXCEPT(lsst::pex::exceptions::InvalidParameterError,
284 "warping kernel is smaller than mask warping kernel");
295 throw LSST_EXCEPT(lsst::pex::exceptions::InvalidParameterError,
296 "devicePreference = USE_GPU, but warping kernel not Lanczos");
302 template<
typename DestExposureT,
typename SrcExposureT>
304 DestExposureT &destExposure,
305 SrcExposureT
const &srcExposure,
307 typename DestExposureT::MaskedImageT::SinglePixel padValue
310 if (!destExposure.hasWcs()) {
311 throw LSST_EXCEPT(pexExcept::InvalidParameterError,
"destExposure has no Wcs");
313 if (!srcExposure.hasWcs()) {
314 throw LSST_EXCEPT(pexExcept::InvalidParameterError,
"srcExposure has no Wcs");
316 typename DestExposureT::MaskedImageT mi = destExposure.getMaskedImage();
317 boost::shared_ptr<afwImage::Calib> calibCopy(
new afwImage::Calib(*srcExposure.getCalib()));
318 destExposure.setCalib(calibCopy);
319 destExposure.setFilter(srcExposure.getFilter());
320 return warpImage(mi, *destExposure.getWcs(), srcExposure.getMaskedImage(), *srcExposure.getWcs(),
324 template<
typename DestExposureT,
typename SrcExposureT>
326 DestExposureT &destExposure,
327 SrcExposureT
const &srcExposure,
329 int const interpLength,
330 typename DestExposureT::MaskedImageT::SinglePixel padValue,
334 if (!destExposure.hasWcs()) {
335 throw LSST_EXCEPT(pexExcept::InvalidParameterError,
"destExposure has no Wcs");
337 if (!srcExposure.hasWcs()) {
338 throw LSST_EXCEPT(pexExcept::InvalidParameterError,
"srcExposure has no Wcs");
340 typename DestExposureT::MaskedImageT mi = destExposure.getMaskedImage();
341 boost::shared_ptr<afwImage::Calib> calibCopy(
new afwImage::Calib(*srcExposure.getCalib()));
342 destExposure.setCalib(calibCopy);
343 destExposure.setFilter(srcExposure.getFilter());
344 return warpImage(mi, *destExposure.getWcs(),
345 srcExposure.getMaskedImage(), *srcExposure.getWcs(), warpingKernel, interpLength,
368 inline double computeRelativeArea(
376 return std::abs(dSrcA.getX()*dSrcB.getY() - dSrcA.getY()*dSrcB.getX());
379 template<
typename DestImageT,
typename SrcImageT>
381 DestImageT &destImage,
382 SrcImageT
const &srcImage,
383 afwMath::detail::PositionFunctor
const &computeSrcPos,
385 typename DestImageT::SinglePixel padValue
388 throw LSST_EXCEPT(pexExcept::InvalidParameterError,
389 "destImage is srcImage; cannot warp in place");
397 warpingKernelPtr->shrinkBBox(srcImage.getBBox(afwImage::
LOCAL));
399 for (
int y = 0, height = destImage.getHeight();
y < height; ++
y) {
400 for (
typename DestImageT::x_iterator destPtr = destImage.row_begin(
y), end = destImage.row_end(
y);
401 destPtr != end; ++destPtr) {
408 int interpLength = control.getInterpLength();
411 boost::shared_ptr<afwMath::LanczosWarpingKernel const> const lanczosKernelPtr =
412 boost::dynamic_pointer_cast<afwMath::LanczosWarpingKernel>(warpingKernelPtr);
415 if(!lanczosKernelPtr) {
417 throw LSST_EXCEPT(pexExcept::InvalidParameterError,
"Gpu can process only Lanczos kernels");
421 if (control.getMaskWarpingKernel() )
422 maskWarpingKernelPtr = control.getMaskWarpingKernel();
425 std::pair<int, afwMath::detail::WarpImageGpuStatus::ReturnCode> result =
427 *lanczosKernelPtr, *maskWarpingKernelPtr,
428 computeSrcPos, interpLength, padValue,
false);
431 catch(lsst::afw::gpu::GpuMemoryError) { }
432 catch(pexExcept::MemoryError) { }
433 catch(lsst::afw::gpu::GpuRuntimeError) { }
435 std::pair<int, afwMath::detail::WarpImageGpuStatus::ReturnCode> result =
437 *lanczosKernelPtr, *maskWarpingKernelPtr,
438 computeSrcPos, interpLength, padValue,
443 "Gpu cannot perform this warp (kernel too big?)");
449 int numGoodPixels = 0;
454 int const srcWidth = srcImage.
getWidth();
455 int const srcHeight = srcImage.getHeight();
456 pexLog::TTrace<3>(
"lsst.afw.math.warp",
"source image width=%d; height=%d", srcWidth, srcHeight);
458 int const destWidth = destImage.getWidth();
459 int const destHeight = destImage.getHeight();
461 pexLog::TTrace<3>(
"lsst.afw.math.warp",
"remap image width=%d; height=%d", destWidth, destHeight);
464 pexLog::TTrace<4>(
"lsst.afw.math.warp",
"Remapping masked image");
473 std::vector<afwGeom::Point2D> _srcPosList(1 + destWidth);
474 std::vector<afwGeom::Point2D>::iterator
const srcPosView = _srcPosList.begin() + 1;
476 int const maxCol = destWidth - 1;
477 int const maxRow = destHeight - 1;
479 afwMath::detail::WarpAtOnePoint<DestImageT, SrcImageT> warpAtOnePoint(srcImage, control, padValue);
481 if (interpLength > 0) {
486 int const numColEdges = 2 + ((destWidth - 1) / interpLength);
490 std::vector<int> edgeColList;
491 edgeColList.reserve(numColEdges);
495 std::vector<double> invWidthList;
496 invWidthList.reserve(numColEdges);
499 edgeColList.push_back(-1);
500 invWidthList.push_back(0.0);
501 for (
int prevEndCol = -1; prevEndCol < maxCol; prevEndCol += interpLength) {
502 int endCol = prevEndCol + interpLength;
503 if (endCol > maxCol) {
506 edgeColList.push_back(endCol);
507 assert(endCol - prevEndCol > 0);
508 invWidthList.push_back(1.0 / static_cast<double>(endCol - prevEndCol));
510 assert(edgeColList.back() == maxCol);
513 std::vector<afwGeom::Extent2D> yDeltaSrcPosList(edgeColList.size());
517 srcPosView[-1] = computeSrcPos(-1, -1);
518 for (
int colBand = 1, endBand = edgeColList.size(); colBand < endBand; ++colBand) {
519 int const prevEndCol = edgeColList[colBand-1];
520 int const endCol = edgeColList[colBand];
523 afwGeom::Extent2D xDeltaSrcPos = (rightSrcPos - leftSrcPos) * invWidthList[colBand];
525 for (
int col = prevEndCol + 1; col <= endCol; ++
col) {
526 srcPosView[
col] = srcPosView[col-1] + xDeltaSrcPos;
531 while (endRow < maxRow) {
534 int prevEndRow = endRow;
535 endRow = prevEndRow + interpLength;
536 if (endRow > maxRow) {
539 assert(endRow - prevEndRow > 0);
540 double interpInvHeight = 1.0 /
static_cast<double>(endRow - prevEndRow);
543 for (
int colBand = 0, endBand = edgeColList.size(); colBand < endBand; ++colBand) {
544 int endCol = edgeColList[colBand];
546 yDeltaSrcPosList[colBand] = (bottomSrcPos - srcPosView[endCol]) * interpInvHeight;
549 for (
int row = prevEndRow + 1; row <= endRow; ++
row) {
550 typename DestImageT::x_iterator destXIter = destImage.row_begin(row);
551 srcPosView[-1] += yDeltaSrcPosList[0];
552 for (
int colBand = 1, endBand = edgeColList.size(); colBand < endBand; ++colBand) {
555 int const prevEndCol = edgeColList[colBand-1];
556 int const endCol = edgeColList[colBand];
562 afwGeom::Point2D rightSrcPos = srcPosView[endCol] + yDeltaSrcPosList[colBand];
563 afwGeom::Extent2D xDeltaSrcPos = (rightSrcPos - leftSrcPos) * invWidthList[colBand];
565 for (
int col = prevEndCol + 1; col <= endCol; ++
col, ++destXIter) {
568 double relativeArea = computeRelativeArea(srcPos, leftSrcPos, srcPosView[col]);
570 srcPosView[
col] = srcPos;
572 if (warpAtOnePoint(destXIter, srcPos, relativeArea,
587 std::vector<afwGeom::Point2D>::iterator srcPosView = _srcPosList.begin() + 1;
588 for (
int col = -1; col < destWidth; ++
col) {
589 srcPosView[
col] = computeSrcPos(col, -1);
592 for (
int row = 0; row < destHeight; ++
row) {
593 typename DestImageT::x_iterator destXIter = destImage.row_begin(row);
595 srcPosView[-1] = computeSrcPos(-1, row);
597 for (
int col = 0; col < destWidth; ++
col, ++destXIter) {
599 double relativeArea = computeRelativeArea(srcPos, srcPosView[col-1], srcPosView[col]);
600 srcPosView[
col] = srcPos;
602 if (warpAtOnePoint(destXIter, srcPos, relativeArea,
610 return numGoodPixels;
615 template<
typename DestImageT,
typename SrcImageT>
617 DestImageT &destImage,
619 SrcImageT
const &srcImage,
622 typename DestImageT::SinglePixel padValue
625 afwMath::detail::WcsPositionFunctor
const computeSrcPos(destXY0, destWcs, srcWcs);
626 return doWarpImage(destImage, srcImage, computeSrcPos, control, padValue);
629 template<
typename DestImageT,
typename SrcImageT>
631 DestImageT &destImage,
633 SrcImageT
const &srcImage,
636 int const interpLength,
637 typename DestImageT::SinglePixel padValue,
641 afwMath::detail::WcsPositionFunctor
const computeSrcPos(destXY0, destWcs, srcWcs);
643 return doWarpImage(destImage, srcImage, computeSrcPos, control, padValue);
647 template<
typename DestImageT,
typename SrcImageT>
649 DestImageT &destImage,
650 SrcImageT
const &srcImage,
653 typename DestImageT::SinglePixel padValue
656 afwMath::detail::AffineTransformPositionFunctor
const computeSrcPos(destXY0, affineTransform);
657 return doWarpImage(destImage, srcImage, computeSrcPos, control, padValue);
661 template<
typename DestImageT,
typename SrcImageT>
663 DestImageT &destImage,
664 SrcImageT
const &srcImage,
667 int const interpLength,
668 typename DestImageT::SinglePixel padValue,
673 afwMath::detail::AffineTransformPositionFunctor
const computeSrcPos(destXY0, affineTransform);
675 return doWarpImage(destImage, srcImage, computeSrcPos, control, padValue);
679 template<
typename DestImageT,
typename SrcImageT>
681 DestImageT &destImage,
682 SrcImageT
const &srcImage,
686 typename DestImageT::SinglePixel padValue
690 (destImage.getWidth() != srcImage.getWidth()) ||
691 (destImage.getHeight() != srcImage.getHeight()) ||
692 (destImage.getXY0() != srcImage.getXY0())
694 std::ostringstream errStream;
695 errStream <<
"src and dest images must have same size and xy0.";
696 throw LSST_EXCEPT(pexExcept::InvalidParameterError, errStream.str());
700 SrcImageT srcImageCopy(srcImage,
true);
701 srcImageCopy.setXY0(0, 0);
702 destImage.setXY0(0, 0);
712 static float t = 0.0;
713 float t_before = 1.0*clock()/CLOCKS_PER_SEC;
714 int n =
warpImage(destImage, srcImageCopy, affTran, control, padValue);
715 float t_after = 1.0*clock()/CLOCKS_PER_SEC;
716 float dt = t_after - t_before;
718 std::cout <<srcImage.getWidth()<<
"x"<<srcImage.getHeight()<<
": "<< dt <<
" "<< t <<std::endl;
720 int n =
warpImage(destImage, srcImageCopy, affTran, control, padValue);
724 destImage.setXY0(srcImage.getXY0());
730 template<
typename DestImageT,
typename SrcImageT>
732 DestImageT &destImage,
733 SrcImageT
const &srcImage,
737 int const interpLength,
738 typename DestImageT::SinglePixel padValue,
742 return warpCenteredImage(destImage, srcImage, linearTransform, centerPosition, control, padValue);
751 #define EXPOSURE(PIXTYPE) afwImage::Exposure<PIXTYPE, afwImage::MaskPixel, afwImage::VariancePixel>
752 #define MASKEDIMAGE(PIXTYPE) afwImage::MaskedImage<PIXTYPE, afwImage::MaskPixel, afwImage::VariancePixel>
753 #define IMAGE(PIXTYPE) afwImage::Image<PIXTYPE>
756 #define INSTANTIATE(DESTIMAGEPIXELT, SRCIMAGEPIXELT) \
757 template int afwMath::warpCenteredImage( \
758 IMAGE(DESTIMAGEPIXELT) &destImage, \
759 IMAGE(SRCIMAGEPIXELT) const &srcImage, \
760 afwGeom::LinearTransform const &linearTransform, \
761 afwGeom::Point2D const ¢erPosition, \
762 afwMath::WarpingControl const &control, \
763 IMAGE(DESTIMAGEPIXELT)::SinglePixel padValue); NL \
764 template int afwMath::warpCenteredImage( \
765 MASKEDIMAGE(DESTIMAGEPIXELT) &destImage, \
766 MASKEDIMAGE(SRCIMAGEPIXELT) const &srcImage, \
767 afwGeom::LinearTransform const &linearTransform, \
768 afwGeom::Point2D const ¢erPosition, \
769 afwMath::WarpingControl const &control, \
770 MASKEDIMAGE(DESTIMAGEPIXELT)::SinglePixel padValue); NL \
771 template int afwMath::warpCenteredImage( \
772 IMAGE(DESTIMAGEPIXELT) &destImage, \
773 IMAGE(SRCIMAGEPIXELT) const &srcImage, \
774 afwMath::SeparableKernel &warpingKernel, \
775 afwGeom::LinearTransform const &linearTransform, \
776 afwGeom::Point2D const ¢erPosition, \
777 int const interpLength, \
778 IMAGE(DESTIMAGEPIXELT)::SinglePixel padValue, \
779 lsst::afw::gpu::DevicePreference devPref); NL \
780 template int afwMath::warpCenteredImage( \
781 MASKEDIMAGE(DESTIMAGEPIXELT) &destImage, \
782 MASKEDIMAGE(SRCIMAGEPIXELT) const &srcImage, \
783 afwMath::SeparableKernel &warpingKernel, \
784 afwGeom::LinearTransform const &linearTransform, \
785 afwGeom::Point2D const ¢erPosition, \
786 int const interpLength, \
787 MASKEDIMAGE(DESTIMAGEPIXELT)::SinglePixel padValue, \
788 lsst::afw::gpu::DevicePreference devPref); NL \
789 template int afwMath::warpImage( \
790 IMAGE(DESTIMAGEPIXELT) &destImage, \
791 IMAGE(SRCIMAGEPIXELT) const &srcImage, \
792 afwGeom::AffineTransform const &affineTransform, \
793 afwMath::WarpingControl const &control, \
794 IMAGE(DESTIMAGEPIXELT)::SinglePixel padValue); NL \
795 template int afwMath::warpImage( \
796 MASKEDIMAGE(DESTIMAGEPIXELT) &destImage, \
797 MASKEDIMAGE(SRCIMAGEPIXELT) const &srcImage, \
798 afwGeom::AffineTransform const &affineTransform, \
799 afwMath::WarpingControl const &control, \
800 MASKEDIMAGE(DESTIMAGEPIXELT)::SinglePixel padValue); NL \
801 template int afwMath::warpImage( \
802 IMAGE(DESTIMAGEPIXELT) &destImage, \
803 IMAGE(SRCIMAGEPIXELT) const &srcImage, \
804 afwMath::SeparableKernel &warpingKernel, \
805 afwGeom::AffineTransform const &affineTransform, \
806 int const interpLength, \
807 IMAGE(DESTIMAGEPIXELT)::SinglePixel padValue, \
808 lsst::afw::gpu::DevicePreference devPref); NL \
809 template int afwMath::warpImage( \
810 MASKEDIMAGE(DESTIMAGEPIXELT) &destImage, \
811 MASKEDIMAGE(SRCIMAGEPIXELT) const &srcImage, \
812 afwMath::SeparableKernel &warpingKernel, \
813 afwGeom::AffineTransform const &affineTransform, \
814 int const interpLength, \
815 MASKEDIMAGE(DESTIMAGEPIXELT)::SinglePixel padValue, \
816 lsst::afw::gpu::DevicePreference devPref); NL \
817 template int afwMath::warpImage( \
818 IMAGE(DESTIMAGEPIXELT) &destImage, \
819 afwImage::Wcs const &destWcs, \
820 IMAGE(SRCIMAGEPIXELT) const &srcImage, \
821 afwImage::Wcs const &srcWcs, \
822 afwMath::WarpingControl const &control, \
823 IMAGE(DESTIMAGEPIXELT)::SinglePixel padValue); NL \
824 template int afwMath::warpImage( \
825 MASKEDIMAGE(DESTIMAGEPIXELT) &destImage, \
826 afwImage::Wcs const &destWcs, \
827 MASKEDIMAGE(SRCIMAGEPIXELT) const &srcImage, \
828 afwImage::Wcs const &srcWcs, \
829 afwMath::WarpingControl const &control, \
830 MASKEDIMAGE(DESTIMAGEPIXELT)::SinglePixel padValue); NL \
831 template int afwMath::warpImage( \
832 IMAGE(DESTIMAGEPIXELT) &destImage, \
833 afwImage::Wcs const &destWcs, \
834 IMAGE(SRCIMAGEPIXELT) const &srcImage, \
835 afwImage::Wcs const &srcWcs, \
836 afwMath::SeparableKernel &warpingKernel, \
837 int const interpLength, \
838 IMAGE(DESTIMAGEPIXELT)::SinglePixel padValue, \
839 lsst::afw::gpu::DevicePreference devPref); NL \
840 template int afwMath::warpImage( \
841 MASKEDIMAGE(DESTIMAGEPIXELT) &destImage, \
842 afwImage::Wcs const &destWcs, \
843 MASKEDIMAGE(SRCIMAGEPIXELT) const &srcImage, \
844 afwImage::Wcs const &srcWcs, \
845 afwMath::SeparableKernel &warpingKernel, \
846 int const interpLength, \
847 MASKEDIMAGE(DESTIMAGEPIXELT)::SinglePixel padValue, \
848 lsst::afw::gpu::DevicePreference devPref); NL \
849 template int afwMath::warpExposure( \
850 EXPOSURE(DESTIMAGEPIXELT) &destExposure, \
851 EXPOSURE(SRCIMAGEPIXELT) const &srcExposure, \
852 afwMath::WarpingControl const &control,\
853 EXPOSURE(DESTIMAGEPIXELT)::MaskedImageT::SinglePixel padValue); NL \
854 template int afwMath::warpExposure( \
855 EXPOSURE(DESTIMAGEPIXELT) &destExposure, \
856 EXPOSURE(SRCIMAGEPIXELT) const &srcExposure, \
857 afwMath::SeparableKernel &warpingKernel, \
858 int const interpLength, \
859 EXPOSURE(DESTIMAGEPIXELT)::MaskedImageT::SinglePixel padValue, \
860 lsst::afw::gpu::DevicePreference devPref);
bool isGpuEnabled()
returns true if GPU acceleration is enabled
virtual void setKernelParameter(unsigned int ind, double value) const
Set one kernel parameter.
GPU accelerared image warping.
An include file to include the header files for lsst::afw::geom.
virtual void setKernelParameter(unsigned int ind, double value) const
Set one kernel parameter.
Declare the Kernel class and subclasses.
geom::Extent2I const getDimensions() const
Return the Kernel's dimensions (width, height)
double indexToPosition(double ind)
Convert image index to image position.
bool contains(Point2I const &point) const
Return true if the box contains the point.
additional GPU exceptions
boost::shared_ptr< SeparableKernel > makeWarpingKernel(std::string name)
Return a warping kernel given its name.
geom::Point2D skyToPixel(geom::Angle sky1, geom::Angle sky2) const
Convert from sky coordinates (e.g ra/dec) to pixel positions.
definition of the Trace messaging facilities
A kernel described by a pair of functions: func(x, y) = colFunc(x) * rowFunc(y)
void setWarpingKernelName(std::string const &warpingKernelName)
set the warping kernel by name
void _testDevicePreference(lsst::afw::gpu::DevicePreference const &devicePreference, boost::shared_ptr< SeparableKernel const > const &warpingKernelPtr) const
test if GPU device preference and main warping kernel are compatible
Parameters to control convolution.
Implementation of the WCS standard for a any projection.
int warpCenteredImage(DestImageT &destImage, SrcImageT const &srcImage, lsst::afw::geom::LinearTransform const &linearTransform, lsst::afw::geom::Point2D const ¢erPosition, WarpingControl const &control, typename DestImageT::SinglePixel padValue=lsst::afw::math::edgePixel< DestImageT >(typename lsst::afw::image::detail::image_traits< DestImageT >::image_category()))
Warp an image with a LinearTranform about a specified point. This enables warping an image of e...
boost::shared_ptr< coord::Coord > pixelToSky(double pix1, double pix2) const
Convert from celestial coordinates to pixel coordinates.
DevicePreference
A type used to select whether to use CPU or GPU device.
void setMaskWarpingKernel(SeparableKernel const &maskWarpingKernel)
set the mask warping kernel
An integer coordinate rectangle.
int warpImage(DestImageT &destImage, lsst::afw::image::Wcs const &destWcs, SrcImageT const &srcImage, lsst::afw::image::Wcs const &srcWcs, WarpingControl const &control, typename DestImageT::SinglePixel padValue=lsst::afw::math::edgePixel< DestImageT >(typename lsst::afw::image::detail::image_traits< DestImageT >::image_category()))
Warp an Image or MaskedImage to a new Wcs. See also convenience function warpExposure() to warp an Ex...
table::Key< table::Array< Kernel::Pixel > > image
int getOrder() const
get the order of the kernel
int getWidth() const
Return the Kernel's width.
int warpExposure(DestExposureT &destExposure, SrcExposureT const &srcExposure, WarpingControl const &control, typename DestExposureT::MaskedImageT::SinglePixel padValue=lsst::afw::math::edgePixel< typename DestExposureT::MaskedImageT >(typename lsst::afw::image::detail::image_traits< typename DestExposureT::MaskedImageT >::image_category()))
Warp (remap) one exposure to another.
Include files required for standard LSST Exception handling.
void setMaskWarpingKernelName(std::string const &maskWarpingKernelName)
set or clear the mask warping kernel by name
bool isSameObject(A const &, B const &)
bool isGpuBuild()
Inline function which returns true only when GPU_BUILD macro is defined.
void setWarpingKernel(SeparableKernel const &warpingKernel)
set the warping kernel
Interface for CPU/GPU device selection.
std::pair< int, WarpImageGpuStatus::ReturnCode > warpImageGPU(DestImageT &destImage, SrcImageT const &srcImage, lsst::afw::math::LanczosWarpingKernel const &warpingKernel, lsst::afw::math::SeparableKernel const &maskWarpingKernel, PositionFunctor const &computeSrcPos, int const interpLength, typename DestImageT::SinglePixel padValue, const bool forceProcessing=true)
GPU accelerated image warping using Lanczos resampling.
lsst::afw::geom::Point2I getCtr() const
Return index of kernel's center.
Bilinear warping: fast; good for undersampled data.
virtual void setKernelParameter(unsigned int ind, double value) const
Set one kernel parameter.
#define LSST_EXCEPT(type,...)
tbl::Key< std::string > warpingKernelName
Support for warping an image to a new WCS.
virtual void setKernelParameter(unsigned int ind, double value) const
Set one kernel parameter.
Nearest neighbor warping: fast; good for undersampled data.
void _testWarpingKernels(SeparableKernel const &warpingKernel, SeparableKernel const &maskWarpingKernel) const
Throw an exception if the two kernels are not compatible in shape.
Lanczos warping: accurate but slow and can introduce ringing artifacts.
ImageT::image_category image_category
Extent< double, 2 > Extent2D
GPU accelerared image warping.
virtual boost::shared_ptr< Kernel > clone() const
Return a pointer to a deep copy of this kernel.
int getWidth() const
Return the number of columns in the image.
Kernels are used for convolution with MaskedImages and (eventually) Images.
A class to represent a 2-dimensional array of pixels.
A function to determine whether compiling for GPU is enabled.
Functions to handle coordinates.