LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
Public Member Functions | Public Attributes | List of all members
lsst.afw.display.rgb._rgbContinued.AsinhMapping Class Reference
Inheritance diagram for lsst.afw.display.rgb._rgbContinued.AsinhMapping:
lsst.afw.display.rgb._rgbContinued.Mapping lsst.afw.display.rgb._rgbContinued.AsinhZScaleMapping

Public Member Functions

def __init__ (self, minimum, dataRange, Q=8)
 
def mapIntensityToUint8 (self, intensity)
 
def makeRgbImage (self, imageR=None, imageG=None, imageB=None, xSize=None, ySize=None, rescaleFactor=None)
 
def intensity (self, imageR, imageG, imageB)
 

Public Attributes

 minimum
 

Detailed Description

A mapping for an asinh stretch (preserving colours independent of brightness)

x = asinh(Q (I - minimum)/range)/Q

Notes
-----
This reduces to a linear stretch if Q == 0

See http://adsabs.harvard.edu/abs/2004PASP..116..133L

Definition at line 282 of file _rgbContinued.py.

Constructor & Destructor Documentation

◆ __init__()

def lsst.afw.display.rgb._rgbContinued.AsinhMapping.__init__ (   self,
  minimum,
  dataRange,
  Q = 8 
)

Reimplemented in lsst.afw.display.rgb._rgbContinued.AsinhZScaleMapping.

Definition at line 294 of file _rgbContinued.py.

294  def __init__(self, minimum, dataRange, Q=8):
295  Mapping.__init__(self, minimum)
296 
297  # 32bit floating point machine epsilon; sys.float_info.epsilon is 64bit
298  epsilon = 1.0/2**23
299  if abs(Q) < epsilon:
300  Q = 0.1
301  else:
302  Qmax = 1e10
303  if Q > Qmax:
304  Q = Qmax
305 
306  if False:
307  self._slope = self._uint8Max/Q # gradient at origin is self._slope
308  else:
309  frac = 0.1 # gradient estimated using frac*range is _slope
310  self._slope = frac*self._uint8Max/np.arcsinh(frac*Q)
311 
312  self._soften = Q/float(dataRange)
313 
Angle abs(Angle const &a)
Definition: Angle.h:106

Member Function Documentation

◆ intensity()

def lsst.afw.display.rgb._rgbContinued.Mapping.intensity (   self,
  imageR,
  imageG,
  imageB 
)
inherited
Return the total intensity from the red, blue, and green intensities

Notes
-----
This is a naive computation, and may be overridden by subclasses

Definition at line 160 of file _rgbContinued.py.

160  def intensity(self, imageR, imageG, imageB):
161  """Return the total intensity from the red, blue, and green intensities
162 
163  Notes
164  -----
165  This is a naive computation, and may be overridden by subclasses
166  """
167  return computeIntensity(imageR, imageG, imageB)
168 
def computeIntensity(imageR, imageG=None, imageB=None)

◆ makeRgbImage()

def lsst.afw.display.rgb._rgbContinued.Mapping.makeRgbImage (   self,
  imageR = None,
  imageG = None,
  imageB = None,
  xSize = None,
  ySize = None,
  rescaleFactor = None 
)
inherited
Convert 3 arrays, imageR, imageG, and imageB into a numpy RGB image

imageR : `lsst.afw.image.Image` or `numpy.ndarray`, (Nx, Ny)
    Image to map to red (if `None`, use the image passed to the ctor)
imageG : `lsst.afw.image.Image` or `numpy.ndarray`, (Nx, Ny), optional
    Image to map to green (if `None`, use imageR)
imageB : `lsst.afw.image.Image` or `numpy.ndarray`, (Nx, Ny), optional
    Image to map to blue (if `None`, use imageR)
xSize : `int`, optional
    Desired width of RGB image. If ``ySize`` is `None`, preserve aspect ratio
ySize : `int`, optional
    Desired height of RGB image
rescaleFactor : `float`, optional
    Make size of output image ``rescaleFactor*size`` of the input image

Definition at line 98 of file _rgbContinued.py.

99  xSize=None, ySize=None, rescaleFactor=None):
100  """Convert 3 arrays, imageR, imageG, and imageB into a numpy RGB image
101 
102  imageR : `lsst.afw.image.Image` or `numpy.ndarray`, (Nx, Ny)
103  Image to map to red (if `None`, use the image passed to the ctor)
104  imageG : `lsst.afw.image.Image` or `numpy.ndarray`, (Nx, Ny), optional
105  Image to map to green (if `None`, use imageR)
106  imageB : `lsst.afw.image.Image` or `numpy.ndarray`, (Nx, Ny), optional
107  Image to map to blue (if `None`, use imageR)
108  xSize : `int`, optional
109  Desired width of RGB image. If ``ySize`` is `None`, preserve aspect ratio
110  ySize : `int`, optional
111  Desired height of RGB image
112  rescaleFactor : `float`, optional
113  Make size of output image ``rescaleFactor*size`` of the input image
114  """
115  if imageR is None:
116  if self._image is None:
117  raise RuntimeError(
118  "You must provide an image (or pass one to the constructor)")
119  imageR = self._image
120 
121  if imageG is None:
122  imageG = imageR
123  if imageB is None:
124  imageB = imageR
125 
126  imageRGB = [imageR, imageG, imageB]
127  for i, c in enumerate(imageRGB):
128  if hasattr(c, "getImage"):
129  c = imageRGB[i] = c.getImage()
130  if hasattr(c, "getArray"):
131  imageRGB[i] = c.getArray()
132 
133  if xSize is not None or ySize is not None:
134  assert rescaleFactor is None, "You may not specify a size and rescaleFactor"
135  h, w = imageRGB[0].shape
136  if ySize is None:
137  ySize = int(xSize*h/float(w) + 0.5)
138  elif xSize is None:
139  xSize = int(ySize*w/float(h) + 0.5)
140 
141  size = (ySize, xSize) # n.b. y, x order for scipy
142  elif rescaleFactor is not None:
143  size = float(rescaleFactor) # an int is intepreted as a percentage
144  else:
145  size = None
146 
147  if size is not None:
148  try:
149  import scipy.misc
150  except ImportError as e:
151  raise RuntimeError(
152  f"Unable to rescale as scipy.misc is unavailable: {e}")
153 
154  for i, im in enumerate(imageRGB):
155  imageRGB[i] = scipy.misc.imresize(
156  im, size, interp='bilinear', mode='F')
157 
158  return np.dstack(self._convertImagesToUint8(*imageRGB)).astype(np.uint8)
159 

◆ mapIntensityToUint8()

def lsst.afw.display.rgb._rgbContinued.AsinhMapping.mapIntensityToUint8 (   self,
  intensity 
)
Return an array which, when multiplied by an image, returns that image mapped to the range of a
uint8, [0, 255] (but not converted to uint8)

The intensity is assumed to have had minimum subtracted (as that can be done per-band)

Reimplemented from lsst.afw.display.rgb._rgbContinued.Mapping.

Definition at line 314 of file _rgbContinued.py.

314  def mapIntensityToUint8(self, intensity):
315  """Return an array which, when multiplied by an image, returns that image mapped to the range of a
316  uint8, [0, 255] (but not converted to uint8)
317 
318  The intensity is assumed to have had minimum subtracted (as that can be done per-band)
319  """
320  with np.errstate(invalid='ignore', divide='ignore'): # n.b. np.where can't and doesn't short-circuit
321  return np.where(intensity <= 0, 0, np.arcsinh(intensity*self._soften)*self._slope/intensity)
322 
323 

Member Data Documentation

◆ minimum

lsst.afw.display.rgb._rgbContinued.Mapping.minimum
inherited

Definition at line 95 of file _rgbContinued.py.


The documentation for this class was generated from the following file: