LSSTApplications
20.0.0
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: #include main Declare an Image in( for 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: out.assign (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. for } } we called the iterator xy_x_iterator
not x_iterator
for consistency with MaskedImage. Finally write some output files and close out main()
}