LSSTApplications
18.1.0
LSSTDataManagementBasePackage
|
(Return to Images)
(You might be interested to compare this example with the discussion of Image locators; apart from an include file and a typedef, the only difference is the use of ImageT::Pixel(y, 0x1, 10)
as the assigned pixel value instead of y
).
Iterators provide access to an image, pixel by pixel. You often want access to neighbouring pixels (e.g. computing a gradient, or smoothing). Let's consider the problem of smoothing with a
kernel (the code's in maskedImage2.cc):
Start by including MaskedImage.h, defining a namespace for clarity:
That didn't gain us much, did it? The code's a little messier than using x_iterator
. But now we can add code to calculate the smoothed image. First make an output image, and copy the input pixels:
Now do the smoothing:
(N.b. you don't really want to do this; not only is this kernel separable into1
2
1
in first the x
then the y
directions, but lsst::afw::math
can do convolutions for you).
Here's a faster way to do the same thing (the use of an Image::Ptr
is just for variety)
xy_loc::cached_location_t
variables remember relative positions.
We can rewrite this to move setting nw
, se
etc. out of the loop:
You may have noticed that that kernel isn't normalised. We could change the coefficients, but that'd slow things down for integer images (such as the one here); but we can normalise after the fact by making an Image that shares pixels with the central part of out2
and manipulating it via overloaded operator/=
N.b. you can use the iterator embedded in the locator directly if you really want to, e.g.
Note that this isn't quite the samex_iterator
as before, due to the need to make the x_iterator
move the underlying xy_locator
.
Finally write some output files and close out main()
: