lsst.afw
g3a5ebb7d8a+28b83bf6a5
Toggle main menu visibility
Loading...
Searching...
No Matches
include
lsst
afw
math
ConvolveImage.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_CONVOLVEIMAGE_H
26
#define LSST_AFW_MATH_CONVOLVEIMAGE_H
27
/*
28
* Convolve and convolveAtAPoint functions for Image and Kernel
29
*
30
* @todo Consider adding a flag to convolve indicating which specialized version of basicConvolve was used.
31
* This would only be used for unit testing and trace messages suffice (barely), so not a high priority.
32
*/
33
#include <limits>
34
#include <sstream>
35
36
#include "
lsst/pex/exceptions.h
"
37
#include "
lsst/afw/image/Image.h
"
38
#include "
lsst/afw/image/MaskedImage.h
"
39
#include "
lsst/afw/math/Kernel.h
"
40
41
namespace
lsst
{
42
namespace
afw
{
43
namespace
math
{
44
50
class
ConvolutionControl
{
51
public
:
52
ConvolutionControl
(
bool
doNormalize =
true
,
53
bool
doCopyEdge =
false
,
55
int
maxInterpolationDistance = 10
57
)
58
: _doNormalize(doNormalize),
59
_doCopyEdge(doCopyEdge),
60
_maxInterpolationDistance(maxInterpolationDistance) {}
61
62
bool
getDoNormalize
()
const
{
return
_doNormalize; }
63
bool
getDoCopyEdge
()
const
{
return
_doCopyEdge; }
64
int
getMaxInterpolationDistance
()
const
{
return
_maxInterpolationDistance; };
65
66
void
setDoNormalize
(
bool
doNormalize) { _doNormalize = doNormalize; }
67
void
setDoCopyEdge
(
bool
doCopyEdge) { _doCopyEdge = doCopyEdge; }
68
void
setMaxInterpolationDistance
(
int
maxInterpolationDistance) {
69
_maxInterpolationDistance = maxInterpolationDistance;
70
}
71
72
private
:
73
bool
_doNormalize;
74
bool
_doCopyEdge;
76
int
_maxInterpolationDistance;
78
};
79
102
template
<
typename
OutImageT,
typename
InImageT>
103
void
scaledPlus
(OutImageT& outImage,
double
c1, InImageT
const
& inImage1,
double
c2,
104
InImageT
const
& inImage2);
105
106
template
<
typename
OutImageT,
typename
InImageT>
107
inline
typename
OutImageT::SinglePixel
convolveAtAPoint
(
108
typename
InImageT::const_xy_locator inImageLocator,
109
typename
lsst::afw::image::Image<lsst::afw::math::Kernel::Pixel>::const_xy_locator
kernelLocator,
110
int
kWidth,
int
kHeight);
111
112
template
<
typename
OutImageT,
typename
InImageT>
113
inline
typename
OutImageT::SinglePixel
convolveAtAPoint
(
114
typename
InImageT::const_xy_locator inImageLocator,
115
std::vector<lsst::afw::math::Kernel::Pixel>
const
& kernelColList,
116
std::vector<lsst::afw::math::Kernel::Pixel>
const
& kernelRowList);
117
188
template
<
typename
OutImageT,
typename
InImageT,
typename
KernelT>
189
void
convolve
(OutImageT& convolvedImage, InImageT
const
& inImage, KernelT
const
& kernel,
190
ConvolutionControl
const
& convolutionControl = ConvolutionControl());
191
197
template
<
typename
ImageT>
198
typename
ImageT::SinglePixel
edgePixel
(
lsst::afw::image::detail::Image_tag
200
) {
201
using
SinglePixelT =
typename
ImageT::SinglePixel;
202
return
SinglePixelT(
std::numeric_limits<SinglePixelT>::has_quiet_NaN
203
?
std::numeric_limits<SinglePixelT>::quiet_NaN
()
204
: 0);
205
}
206
218
template
<
typename
MaskedImageT>
219
typename
MaskedImageT::SinglePixel
edgePixel
(
220
lsst::afw::image::detail::MaskedImage_tag
222
) {
223
using
ImagePixelT =
typename
MaskedImageT::Image::Pixel;
224
using
VariancePixelT =
typename
MaskedImageT::Variance::Pixel;
225
226
auto
imagePixel =
std::numeric_limits<ImagePixelT>::has_quiet_NaN
227
?
std::numeric_limits<ImagePixelT>::quiet_NaN
()
228
: 0;
229
auto
maskPixel = MaskedImageT::Mask::getPlaneBitMask(
"NO_DATA"
);
230
auto
variancePixel =
std::numeric_limits<VariancePixelT>::has_infinity
231
?
std::numeric_limits<VariancePixelT>::infinity
()
232
: 0;
233
return
typename
MaskedImageT::SinglePixel(imagePixel, maskPixel, variancePixel);
234
}
235
236
/*
237
* Define inline functions
238
*/
239
256
template
<
typename
OutImageT,
typename
InImageT>
257
inline
typename
OutImageT::SinglePixel
convolveAtAPoint
(
258
typename
InImageT::const_xy_locator inImageLocator,
259
image::Image<Kernel::Pixel>::const_xy_locator
kernelLocator,
int
kWidth,
int
kHeight) {
260
typename
OutImageT::SinglePixel outValue = 0;
261
for
(
int
kRow = 0; kRow != kHeight; ++kRow) {
262
for
(
image::Image<Kernel::Pixel>::const_xy_locator
kEnd =
263
kernelLocator + image::detail::difference_type(kWidth, 0);
264
kernelLocator != kEnd; ++inImageLocator.x(), ++kernelLocator.x()) {
265
typename
Kernel::Pixel
const
kVal = kernelLocator[0];
266
if
(kVal != 0) {
267
outValue += *inImageLocator * kVal;
268
}
269
}
270
271
inImageLocator += image::detail::difference_type(-kWidth, 1);
272
kernelLocator += image::detail::difference_type(-kWidth, 1);
273
}
274
275
return
outValue;
276
}
277
292
template
<
typename
OutImageT,
typename
InImageT>
293
inline
typename
OutImageT::SinglePixel
convolveAtAPoint
(
typename
InImageT::const_xy_locator inImageLocator,
294
std::vector<Kernel::Pixel>
const
& kernelXList,
295
std::vector<Kernel::Pixel>
const
& kernelYList) {
296
using
k_iter =
typename
std::vector<Kernel::Pixel>::const_iterator;
297
298
using
OutT =
typename
OutImageT::SinglePixel;
299
OutT outValue = 0;
300
for
(
double
kValY : kernelYList) {
301
OutT outValueY = 0;
302
for
(k_iter kernelXIter = kernelXList.
begin
(), xEnd = kernelXList.
end
(); kernelXIter != xEnd;
303
++kernelXIter, ++inImageLocator.x()) {
304
typename
Kernel::Pixel
const
kValX = *kernelXIter;
305
if
(kValX != 0) {
306
outValueY += *inImageLocator * kValX;
307
}
308
}
309
310
if
(kValY != 0) {
311
outValue += outValueY * kValY;
312
}
313
314
inImageLocator += image::detail::difference_type(-kernelXList.
size
(), 1);
315
}
316
317
return
outValue;
318
}
319
}
// namespace math
320
}
// namespace afw
321
}
// namespace lsst
322
323
#endif
// !defined(LSST_AFW_MATH_CONVOLVEIMAGE_H)
Kernel.h
MaskedImage.h
std::vector::begin
T begin(T... args)
lsst::afw::image::ImageBase::const_xy_locator
typename _view_t::xy_locator::const_t const_xy_locator
A const_xy_locator.
Definition
ImageBase.h:123
lsst::afw::math::ConvolutionControl::setDoCopyEdge
void setDoCopyEdge(bool doCopyEdge)
Definition
ConvolveImage.h:67
lsst::afw::math::ConvolutionControl::getDoCopyEdge
bool getDoCopyEdge() const
Definition
ConvolveImage.h:63
lsst::afw::math::ConvolutionControl::setDoNormalize
void setDoNormalize(bool doNormalize)
Definition
ConvolveImage.h:66
lsst::afw::math::ConvolutionControl::getMaxInterpolationDistance
int getMaxInterpolationDistance() const
Definition
ConvolveImage.h:64
lsst::afw::math::ConvolutionControl::ConvolutionControl
ConvolutionControl(bool doNormalize=true, bool doCopyEdge=false, int maxInterpolationDistance=10)
Definition
ConvolveImage.h:52
lsst::afw::math::ConvolutionControl::getDoNormalize
bool getDoNormalize() const
Definition
ConvolveImage.h:62
lsst::afw::math::ConvolutionControl::setMaxInterpolationDistance
void setMaxInterpolationDistance(int maxInterpolationDistance)
Definition
ConvolveImage.h:68
lsst::afw::math::Kernel::Pixel
double Pixel
Definition
Kernel.h:112
std::vector::end
T end(T... args)
exceptions.h
Image.h
std::numeric_limits::infinity
T infinity(T... args)
lsst::afw::math
Definition
statistics.dox:6
lsst::afw::math::convolveAtAPoint
OutImageT::SinglePixel convolveAtAPoint(typename InImageT::const_xy_locator inImageLocator, typename lsst::afw::image::Image< lsst::afw::math::Kernel::Pixel >::const_xy_locator kernelLocator, int kWidth, int kHeight)
Apply convolution kernel to an image at one point.
Definition
ConvolveImage.h:257
lsst::afw::math::scaledPlus
void scaledPlus(OutImageT &outImage, double c1, InImageT const &inImage1, double c2, InImageT const &inImage2)
Compute the scaled sum of two images.
Definition
ConvolveImage.cc:153
lsst::afw::math::convolve
void convolve(OutImageT &convolvedImage, InImageT const &inImage, KernelT const &kernel, ConvolutionControl const &convolutionControl=ConvolutionControl())
Convolve an Image or MaskedImage with a Kernel, setting pixels of an existing output image.
Definition
ConvolveImage.cc:181
lsst::afw::math::edgePixel
ImageT::SinglePixel edgePixel(lsst::afw::image::detail::Image_tag)
Return an off-the-edge pixel appropriate for a given Image type.
Definition
ConvolveImage.h:198
lsst::afw
Definition
imageAlgorithm.dox:1
lsst
std::numeric_limits
std::numeric_limits::quiet_NaN
T quiet_NaN(T... args)
std::vector::size
T size(T... args)
lsst::afw::image::detail::Image_tag
tag for an Image
Definition
ImageBase.h:63
lsst::afw::image::detail::MaskedImage_tag
A traits class for MaskedImage.
Definition
MaskedImage.h:51
std::vector
Generated on
for lsst.afw by
1.17.0