LSST Applications g0265f82a02+0e5473021a,g02d81e74bb+0dd8ce4237,g1470d8bcf6+3ea6592b6f,g2079a07aa2+86d27d4dc4,g2305ad1205+5ca4c0b359,g295015adf3+d10818ec9d,g2a9a014e59+6f9be1b9cd,g2bbee38e9b+0e5473021a,g337abbeb29+0e5473021a,g3ddfee87b4+703ba97ebf,g487adcacf7+4fa16da234,g50ff169b8f+96c6868917,g52b1c1532d+585e252eca,g591dd9f2cf+ffa42b374e,g5a732f18d5+53520f316c,g64a986408d+0dd8ce4237,g858d7b2824+0dd8ce4237,g8a8a8dda67+585e252eca,g99cad8db69+d39438377f,g9ddcbc5298+9a081db1e4,ga1e77700b3+15fc3df1f7,ga8c6da7877+f1d96605c8,gb0e22166c9+60f28cb32d,gb6a65358fc+0e5473021a,gba4ed39666+c2a2e4ac27,gbb8dafda3b+e5339d463f,gc120e1dc64+da31e9920e,gc28159a63d+0e5473021a,gcf0d15dbbd+703ba97ebf,gdaeeff99f8+f9a426f77a,ge6526c86ff+889fc9d533,ge79ae78c31+0e5473021a,gee10cc3b42+585e252eca,gf18bd8381d+7268b93478,gff1a9f87cc+0dd8ce4237,w.2024.16
LSST Data Management Base Package
Loading...
Searching...
No Matches
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.
 
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.
 
template<typename T >
ndarray::Array< T, 2, 2 > fromFits (ndarray::Array< T, 2, 2 > const &image) const
 Convert to an array.
 

Public Attributes

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

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) {}
T floor(T... args)
double bscale
Scale to apply when reading from FITS.
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.
double bzero
Zero-point 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 494 of file fitsCompression.cc.

494 {
495 ndarray::Array<T, 2, 2> memory = ndarray::allocate(image.getShape());
496 memory.deep() = bscale * image + bzero;
497 return memory;
498}

◆ 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 417 of file fitsCompression.cc.

420 {
422 if (bitpix != detail::Bitpix<T>::value) {
423 throw LSST_EXCEPT(pex::exceptions::InvalidParameterError,
424 "Floating-point images may not be converted to different floating-point types");
425 }
426 if (bscale != 1.0 || bzero != 0.0) {
427 throw LSST_EXCEPT(pex::exceptions::InvalidParameterError,
428 "Scaling may not be applied to floating-point images");
429 }
430 }
431
432 if (bitpix < 0 || (bitpix == 0 && !std::numeric_limits<T>::is_integer) ||
433 (bscale == 1.0 && bzero == 0.0 && !fuzz)) {
434 if (!forceNonfiniteRemoval) {
435 // Type conversion only
436 return detail::makePixelArray(bitpix, ndarray::Array<T const, 1, 1>(ndarray::flatten<1>(image)));
437 }
439 ndarray::Array<T, 1, 1> out = ndarray::allocate(image.getNumElements());
440 auto outIter = out.begin();
441 auto const& flatImage = ndarray::flatten<1>(image);
442 for (auto inIter = flatImage.begin(); inIter != flatImage.end(); ++inIter, ++outIter) {
443 *outIter = std::isfinite(*inIter) ? *inIter : std::numeric_limits<T>::max();
444 }
445 return detail::makePixelArray(bitpix, out);
446 }
447 // Fall through for explicit scaling
448 }
449
450 // Note: BITPIX=8 treated differently, since it uses unsigned values; the rest use signed */
451 double min = bitpix == 8 ? 0 : -std::pow(2.0, bitpix - 1);
452 double max = bitpix == 8 ? 255 : (std::pow(2.0, bitpix - 1) - 1.0);
453
455 // cfitsio saves space for N_RESERVED_VALUES=10 values at the low end
457 }
458
459 double const scale = 1.0 / bscale;
460 std::size_t const num = image.getNumElements();
461 bool const applyFuzz = fuzz && !std::numeric_limits<T>::is_integer && bitpix > 0;
462 ndarray::Array<double, 1, 1> out;
463 if (applyFuzz) {
464 if (tiles.isEmpty()) {
465 throw LSST_EXCEPT(pex::exceptions::InvalidParameterError,
466 "Tile sizes must be provided if fuzzing is desired");
467 }
468 out = CfitsioRandom(seed).forImage<double>(image.getShape(), tiles);
469 } else {
470 out = ndarray::allocate(num);
471 out.deep() = 0;
472 }
473 auto outIter = out.begin();
474 auto const& flatImage = ndarray::flatten<1>(image);
475 for (auto inIter = flatImage.begin(); inIter != flatImage.end(); ++inIter, ++outIter) {
476 double value = (*inIter - bzero) * scale;
477 if (!std::isfinite(value)) {
478 // This choice of "max" for non-finite and overflow pixels is mainly cosmetic --- it has to be
479 // something, and "min" would produce holes in the cores of bright stars.
480 *outIter = blank;
481 continue;
482 }
483 if (applyFuzz) {
484 // Add random factor [0.0,1.0): adds a variance of 1/12,
485 // but preserves the expectation value given the floor()
486 value += *outIter;
487 }
488 *outIter = (value < min ? blank : (value > max ? blank : std::floor(value)));
489 }
490 return detail::makePixelArray(bitpix, out);
491}
int min
int max
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition Exception.h:48
int const N_RESERVED_VALUES
T isfinite(T... args)
T max(T... args)
scale(algorithm, min, max=None, frame=None)
Definition ds9.py:108
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.
T pow(T... args)

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: