LSSTApplications  18.0.0+106,18.0.0+50,19.0.0,19.0.0+1,19.0.0+10,19.0.0+11,19.0.0+13,19.0.0+17,19.0.0+2,19.0.0-1-g20d9b18+6,19.0.0-1-g425ff20,19.0.0-1-g5549ca4,19.0.0-1-g580fafe+6,19.0.0-1-g6fe20d0+1,19.0.0-1-g7011481+9,19.0.0-1-g8c57eb9+6,19.0.0-1-gb5175dc+11,19.0.0-1-gdc0e4a7+9,19.0.0-1-ge272bc4+6,19.0.0-1-ge3aa853,19.0.0-10-g448f008b,19.0.0-12-g6990b2c,19.0.0-2-g0d9f9cd+11,19.0.0-2-g3d9e4fb2+11,19.0.0-2-g5037de4,19.0.0-2-gb96a1c4+3,19.0.0-2-gd955cfd+15,19.0.0-3-g2d13df8,19.0.0-3-g6f3c7dc,19.0.0-4-g725f80e+11,19.0.0-4-ga671dab3b+1,19.0.0-4-gad373c5+3,19.0.0-5-ga2acb9c+2,19.0.0-5-gfe96e6c+2,w.2020.01
LSSTDataManagementBasePackage
Public Member Functions | Public Attributes | List of all members
lsst::afw::fits::ImageScale Struct Reference

Scale to apply to image. More...

#include <fitsCompression.h>

Public Member Functions

 ImageScale (int bitpix_, double bscale_, double bzero_)
 Constructor. More...
 
template<typename T >
std::shared_ptr< detail::PixelArrayBasetoFits (ndarray::Array< T const, 2, 2 > const &image, bool forceNonfiniteRemoval, bool fuzz=true, ndarray::Array< long, 1 > const &tiles=ndarray::Array< long, 1, 1 >(), int seed=1) const
 Convert to an array of pixel values to write to FITS. More...
 
template<typename T >
ndarray::Array< T, 2, 2 > fromFits (ndarray::Array< T, 2, 2 > const &image) const
 Convert to an array. More...
 

Public Attributes

int bitpix
 Bits per pixel; negative means floating-point: 8,16,32,64,-32,-64. More...
 
double bscale
 Scale to apply when reading from FITS. More...
 
double bzero
 Zero-point to apply when reading from FITS. More...
 
long blank
 Value for integer images indicating non-finite values. More...
 

Detailed Description

Scale to apply to image.

Images are scaled to the type implied by the provided BITPIX using the provided scale and zero-point:

value in memory = BZERO + BSCALE * value in FITS

In addition to scaling, a random field of values distributed [0,1) may be added before quantisation ("fuzz"); this preserves the expectation value of the floating-point image, while increasing the variance by 1/12.

Definition at line 262 of file fitsCompression.h.

Constructor & Destructor Documentation

◆ ImageScale()

lsst::afw::fits::ImageScale::ImageScale ( int  bitpix_,
double  bscale_,
double  bzero_ 
)
inline

Constructor.

We make BZERO an integer multiple of BSCALE, because cfitsio notes: "This helps to ensure the same scaling will be performed if the file undergoes multiple fpack/funpack cycles".

The BLANK is 255 for BITPIX=8 since FITS specifies that uses unsigned char; otherwise it is set to the maximum int for the appropriate signed integer.

Definition at line 276 of file fitsCompression.h.

277  : bitpix(bitpix_),
278  bscale(bscale_),
279  bzero(std::floor(bzero_ / bscale_ + 0.5) * bscale_),
280  blank(bitpix > 0 ? (bitpix == 8 ? 255 : (1L << (bitpix - 1)) - 1) : 0) {}
long blank
Value for integer images indicating non-finite values.
int bitpix
Bits per pixel; negative means floating-point: 8,16,32,64,-32,-64.
T floor(T... args)
double bzero
Zero-point to apply when reading from FITS.
double bscale
Scale to apply when reading from FITS.

Member Function Documentation

◆ fromFits()

template<typename T >
ndarray::Array< T, 2, 2 > lsst::afw::fits::ImageScale::fromFits ( ndarray::Array< T, 2, 2 > const &  image) const

Convert to an array.

Use of this method is generally not necessary, since cfitsio automatically applies the scaling on read. However, it may be useful for applying novel scalings (e.g., logarithmic).

Definition at line 486 of file fitsCompression.cc.

486  {
487  ndarray::Array<T, 2, 2> memory = ndarray::allocate(image.getShape());
488  memory.deep() = bscale * image + bzero;
489  return memory;
490 }
double bzero
Zero-point to apply when reading from FITS.
double bscale
Scale to apply when reading from FITS.
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects...

◆ toFits()

template<typename T >
std::shared_ptr< detail::PixelArrayBase > lsst::afw::fits::ImageScale::toFits ( ndarray::Array< T const, 2, 2 > const &  image,
bool  forceNonfiniteRemoval,
bool  fuzz = true,
ndarray::Array< long, 1 > const &  tiles = ndarray::Array<long, 1, 1>(),
int  seed = 1 
) const

Convert to an array of pixel values to write to FITS.

Parameters
[in]imageImage to scale
[in]forceNonfiniteRemovalForce removal of non-finite values? This is useful for lossless compression, because cfitsio doesn't mask out non-finite values, and they end up contaminating the entire tile.
[in]fuzzAdd random values before quantising?
[in]tilesTile dimensions
[in]seedSeed for random number generator
Returns
Array of pixel values, appropriately scaled.

Definition at line 409 of file fitsCompression.cc.

412  {
414  if (bitpix != detail::Bitpix<T>::value) {
415  throw LSST_EXCEPT(pex::exceptions::InvalidParameterError,
416  "Floating-point images may not be converted to different floating-point types");
417  }
418  if (bscale != 1.0 || bzero != 0.0) {
419  throw LSST_EXCEPT(pex::exceptions::InvalidParameterError,
420  "Scaling may not be applied to floating-point images");
421  }
422  }
423 
424  if (bitpix < 0 || (bitpix == 0 && !std::numeric_limits<T>::is_integer) ||
425  (bscale == 1.0 && bzero == 0.0 && !fuzz)) {
426  if (!forceNonfiniteRemoval) {
427  // Type conversion only
428  return detail::makePixelArray(bitpix, ndarray::Array<T const, 1, 1>(ndarray::flatten<1>(image)));
429  }
431  ndarray::Array<T, 1, 1> out = ndarray::allocate(image.getNumElements());
432  auto outIter = out.begin();
433  auto const& flatImage = ndarray::flatten<1>(image);
434  for (auto inIter = flatImage.begin(); inIter != flatImage.end(); ++inIter, ++outIter) {
435  *outIter = std::isfinite(*inIter) ? *inIter : std::numeric_limits<T>::max();
436  }
437  return detail::makePixelArray(bitpix, out);
438  }
439  // Fall through for explicit scaling
440  }
441 
442  // Note: BITPIX=8 treated differently, since it uses unsigned values; the rest use signed */
443  double min = bitpix == 8 ? 0 : -std::pow(2.0, bitpix - 1);
444  double max = bitpix == 8 ? 255 : (std::pow(2.0, bitpix - 1) - 1.0);
445 
447  // cfitsio saves space for N_RESERVED_VALUES=10 values at the low end
448  min += N_RESERVED_VALUES;
449  }
450 
451  double const scale = 1.0 / bscale;
452  std::size_t const num = image.getNumElements();
453  bool const applyFuzz = fuzz && !std::numeric_limits<T>::is_integer && bitpix > 0;
454  ndarray::Array<double, 1, 1> out;
455  if (applyFuzz) {
456  if (tiles.isEmpty()) {
457  throw LSST_EXCEPT(pex::exceptions::InvalidParameterError,
458  "Tile sizes must be provided if fuzzing is desired");
459  }
460  out = CfitsioRandom(seed).forImage<double>(image.getShape(), tiles);
461  } else {
462  out = ndarray::allocate(num);
463  out.deep() = 0;
464  }
465  auto outIter = out.begin();
466  auto const& flatImage = ndarray::flatten<1>(image);
467  for (auto inIter = flatImage.begin(); inIter != flatImage.end(); ++inIter, ++outIter) {
468  double value = (*inIter - bzero) * scale;
469  if (!std::isfinite(value)) {
470  // This choice of "max" for non-finite and overflow pixels is mainly cosmetic --- it has to be
471  // something, and "min" would produce holes in the cores of bright stars.
472  *outIter = blank;
473  continue;
474  }
475  if (applyFuzz) {
476  // Add random factor [0.0,1.0): adds a variance of 1/12,
477  // but preserves the expectation value given the floor()
478  value += *outIter;
479  }
480  *outIter = (value < min ? blank : (value > max ? blank : std::floor(value)));
481  }
482  return detail::makePixelArray(bitpix, out);
483 }
int const N_RESERVED_VALUES
std::shared_ptr< PixelArrayBase > makePixelArray(int bitpix, ndarray::Array< T, 1, 1 > const &array)
Create a PixelArray suitable for an image with the nominated BITPIX.
afw::table::Key< afw::table::Array< ImagePixelT > > image
long blank
Value for integer images indicating non-finite values.
int bitpix
Bits per pixel; negative means floating-point: 8,16,32,64,-32,-64.
def scale(algorithm, min, max=None, frame=None)
Definition: ds9.py:109
T floor(T... args)
int min
double bzero
Zero-point to apply when reading from FITS.
int max
T isfinite(T... args)
double bscale
Scale to apply when reading from FITS.
T max(T... args)
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition: Exception.h:48
T pow(T... args)
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects...

Member Data Documentation

◆ bitpix

int lsst::afw::fits::ImageScale::bitpix

Bits per pixel; negative means floating-point: 8,16,32,64,-32,-64.

Definition at line 263 of file fitsCompression.h.

◆ blank

long lsst::afw::fits::ImageScale::blank

Value for integer images indicating non-finite values.

Definition at line 266 of file fitsCompression.h.

◆ bscale

double lsst::afw::fits::ImageScale::bscale

Scale to apply when reading from FITS.

Definition at line 264 of file fitsCompression.h.

◆ bzero

double lsst::afw::fits::ImageScale::bzero

Zero-point to apply when reading from FITS.

Definition at line 265 of file fitsCompression.h.


The documentation for this struct was generated from the following files: