LSSTApplications
19.0.0-14-gb0260a2+72efe9b372,20.0.0+7927753e06,20.0.0+8829bf0056,20.0.0+995114c5d2,20.0.0+b6f4b2abd1,20.0.0+bddc4f4cbe,20.0.0-1-g253301a+8829bf0056,20.0.0-1-g2b7511a+0d71a2d77f,20.0.0-1-g5b95a8c+7461dd0434,20.0.0-12-g321c96ea+23efe4bbff,20.0.0-16-gfab17e72e+fdf35455f6,20.0.0-2-g0070d88+ba3ffc8f0b,20.0.0-2-g4dae9ad+ee58a624b3,20.0.0-2-g61b8584+5d3db074ba,20.0.0-2-gb780d76+d529cf1a41,20.0.0-2-ged6426c+226a441f5f,20.0.0-2-gf072044+8829bf0056,20.0.0-2-gf1f7952+ee58a624b3,20.0.0-20-geae50cf+e37fec0aee,20.0.0-25-g3dcad98+544a109665,20.0.0-25-g5eafb0f+ee58a624b3,20.0.0-27-g64178ef+f1f297b00a,20.0.0-3-g4cc78c6+e0676b0dc8,20.0.0-3-g8f21e14+4fd2c12c9a,20.0.0-3-gbd60e8c+187b78b4b8,20.0.0-3-gbecbe05+48431fa087,20.0.0-38-ge4adf513+a12e1f8e37,20.0.0-4-g97dc21a+544a109665,20.0.0-4-gb4befbc+087873070b,20.0.0-4-gf910f65+5d3db074ba,20.0.0-5-gdfe0fee+199202a608,20.0.0-5-gfbfe500+d529cf1a41,20.0.0-6-g64f541c+d529cf1a41,20.0.0-6-g9a5b7a1+a1cd37312e,20.0.0-68-ga3f3dda+5fca18c6a4,20.0.0-9-g4aef684+e18322736b,w.2020.45
LSSTDataManagementBasePackage
|
(Return to Images)
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 image2.cc):
Start by including Image.h defining a namespace for clarity:
Declare an Image
Set the image to a ramp
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:
(we didn't need to copy all of them, just the ones around the edge that we won't smooth, but this is an easy way to do it).
Now do the smoothing:
(N.b. you don't really want to do this; not only is this kernel separable into 1
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)
The 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.
we called the iterator xy_x_iterator
, not x_iterator
, for consistency with MaskedImage.
Finally write some output files and close out main()
: