285 """Apply overscan correction in place
287 @param[in,out] ampMaskedImage masked image to correct
288 @param[in] overscanImage overscan data as an afw.image.IMage
289 @param[in] fitType type of fit for overscan correction; one of:
292 - 'POLY' (ordinary polynomial)
293 - 'CHEB' (Chebyshev polynomial)
294 - 'LEG' (Legendre polynomial)
295 - 'NATURAL_SPLINE', 'CUBIC_SPLINE', 'AKIMA_SPLINE' (splines)
296 @param[in] order polynomial order or spline knots (ignored unless fitType
297 indicates a polynomial or spline)
298 @param[in] collapseRej Rejection threshold (sigma) for collapsing dimension of overscan
299 @param[in] statControl Statistics control object
301 ampImage = ampMaskedImage.getImage()
302 if statControl
is None:
304 if fitType ==
'MEAN':
306 elif fitType ==
'MEDIAN':
308 elif fitType
in (
'POLY',
'CHEB',
'LEG',
'NATURAL_SPLINE',
'CUBIC_SPLINE',
'AKIMA_SPLINE'):
309 if hasattr(overscanImage,
"getImage"):
310 biasArray = overscanImage.getImage().getArray()
311 biasArray = numpy.ma.masked_where(overscanImage.getMask().getArray() & statControl.getAndMask(),
314 biasArray = overscanImage.getArray()
316 shortInd = numpy.argmin(biasArray.shape)
319 biasArray = numpy.transpose(biasArray)
322 percentiles = numpy.percentile(biasArray, [25.0, 50.0, 75.0], axis=1)
323 medianBiasArr = percentiles[1]
324 stdevBiasArr = 0.74*(percentiles[2] - percentiles[0])
325 diff = numpy.abs(biasArray - medianBiasArr[:,numpy.newaxis])
326 biasMaskedArr = numpy.ma.masked_where(diff > collapseRej*stdevBiasArr[:,numpy.newaxis], biasArray)
327 collapsed = numpy.mean(biasMaskedArr, axis=1)
328 del biasArray, percentiles, stdevBiasArr, diff, biasMaskedArr
331 collapsed = numpy.transpose(collapsed)
334 indices = 2.0*numpy.arange(num)/float(num) - 1.0
336 if fitType
in (
'POLY',
'CHEB',
'LEG'):
338 poly = numpy.polynomial
339 fitter, evaler = {
"POLY": (poly.polynomial.polyfit, poly.polynomial.polyval),
340 "CHEB": (poly.chebyshev.chebfit, poly.chebyshev.chebval),
341 "LEG": (poly.legendre.legfit, poly.legendre.legval),
344 coeffs = fitter(indices, collapsed, order)
345 fitBiasArr = evaler(indices, coeffs)
346 elif 'SPLINE' in fitType:
355 collapsedMask = collapsed.mask
357 if collapsedMask == numpy.ma.nomask:
358 collapsedMask = numpy.array(len(collapsed)*[numpy.ma.nomask])
362 numPerBin, binEdges = numpy.histogram(indices, bins=numBins,
363 weights=1-collapsedMask.astype(int))
366 values = numpy.histogram(indices, bins=numBins, weights=collapsed)[0]/numPerBin
367 binCenters = numpy.histogram(indices, bins=numBins, weights=indices)[0]/numPerBin
369 values.astype(float),
371 fitBiasArr = numpy.array([interp.interpolate(i)
for i
in indices])
375 import matplotlib.pyplot
as plot
376 figure = plot.figure(1)
378 axes = figure.add_axes((0.1, 0.1, 0.8, 0.8))
379 axes.plot(indices, collapsed,
'k+')
380 axes.plot(indices, fitBiasArr,
'r-')
382 prompt =
"Press Enter or c to continue [chp]... "
384 ans = raw_input(prompt).lower()
385 if ans
in (
"",
"c",):
388 import pdb; pdb.set_trace()
390 print "h[elp] c[ontinue] p[db]"
393 offImage = ampImage.Factory(ampImage.getDimensions())
394 offArray = offImage.getArray()
396 offArray[:,:] = fitBiasArr[:,numpy.newaxis]
398 offArray[:,:] = fitBiasArr[numpy.newaxis,:]
401 (
"overscanCorrection", fitType)
Interpolate::Style stringToInterpStyle(std::string const &style)
Conversion function to switch a string to an Interpolate::Style.
boost::shared_ptr< Interpolate > makeInterpolate(std::vector< double > const &x, std::vector< double > const &y, Interpolate::Style const style=Interpolate::AKIMA_SPLINE)
Pass parameters to a Statistics objectA class to pass parameters which control how the stats are calc...
Statistics makeStatistics(afwImage::Mask< afwImage::MaskPixel > const &msk, int const flags, StatisticsControl const &sctrl)
Specialization to handle Masks.