25 #ifndef LSST_AFW_MATH_CONVOLVEIMAGE_H
26 #define LSST_AFW_MATH_CONVOLVEIMAGE_H
53 bool doCopyEdge =
false,
54 int maxInterpolationDistance = 10
58 : _doNormalize(doNormalize),
59 _doCopyEdge(doCopyEdge),
60 _maxInterpolationDistance(maxInterpolationDistance) {}
69 _maxInterpolationDistance = maxInterpolationDistance;
75 int _maxInterpolationDistance;
102 template <
typename OutImageT,
typename InImageT>
103 void scaledPlus(OutImageT& outImage,
double c1, InImageT
const& inImage1,
double c2,
104 InImageT
const& inImage2);
106 template <
typename OutImageT,
typename InImageT>
108 typename InImageT::const_xy_locator inImageLocator,
110 int kWidth,
int kHeight);
112 template <
typename OutImageT,
typename InImageT>
114 typename InImageT::const_xy_locator inImageLocator,
190 template <
typename OutImageT,
typename InImageT,
typename KernelT>
191 void convolve(OutImageT& convolvedImage, InImageT
const& inImage, KernelT
const& kernel,
192 ConvolutionControl
const& convolutionControl = ConvolutionControl());
199 template <
typename ImageT>
203 typedef typename ImageT::SinglePixel SinglePixelT;
220 template <
typename MaskedImageT>
225 typedef typename MaskedImageT::Image::Pixel ImagePixelT;
226 typedef typename MaskedImageT::Variance::Pixel VariancePixelT;
231 auto maskPixel = MaskedImageT::Mask::getPlaneBitMask(
"NO_DATA");
235 return typename MaskedImageT::SinglePixel(imagePixel, maskPixel, variancePixel);
258 template <
typename OutImageT,
typename InImageT>
260 typename InImageT::const_xy_locator inImageLocator,
262 typename OutImageT::SinglePixel outValue = 0;
263 for (
int kRow = 0; kRow != kHeight; ++kRow) {
265 kEnd = kernelLocator + image::detail::difference_type(kWidth, 0);
266 kernelLocator != kEnd; ++inImageLocator.x(), ++kernelLocator.x()) {
269 outValue += *inImageLocator * kVal;
273 inImageLocator += image::detail::difference_type(-kWidth, 1);
274 kernelLocator += image::detail::difference_type(-kWidth, 1);
294 template <
typename OutImageT,
typename InImageT>
295 inline typename OutImageT::SinglePixel
convolveAtAPoint(
typename InImageT::const_xy_locator inImageLocator,
300 typedef typename OutImageT::SinglePixel OutT;
302 for (k_iter kernelYIter = kernelYList.
begin(), yEnd = kernelYList.
end(); kernelYIter != yEnd;
305 for (k_iter kernelXIter = kernelXList.
begin(), xEnd = kernelXList.
end(); kernelXIter != xEnd;
306 ++kernelXIter, ++inImageLocator.x()) {
309 outValueY += *inImageLocator * kValX;
313 double const kValY = *kernelYIter;
315 outValue += outValueY * kValY;
318 inImageLocator += image::detail::difference_type(-kernelXList.
size(), 1);
327 #endif // !defined(LSST_AFW_MATH_CONVOLVEIMAGE_H)