LSST Applications g0fba68d861+2e894914a0,g1ec0fe41b4+e220e2fb2f,g1f759649c2+d3ce33c3e0,g1fd858c14a+2b9bf32e51,g35bb328faa+fcb1d3bbc8,g4d2262a081+1dc91b7776,g53246c7159+fcb1d3bbc8,g56a49b3a55+1053ce1741,g60b5630c4e+d3ce33c3e0,g67b6fd64d1+fad15079a7,g78460c75b0+2f9a1b4bcd,g786e29fd12+cf7ec2a62a,g8180f54f50+9253e245c2,g8352419a5c+fcb1d3bbc8,g8852436030+f11a5d3b0b,g89139ef638+fad15079a7,g9125e01d80+fcb1d3bbc8,g94187f82dc+d3ce33c3e0,g989de1cb63+fad15079a7,g9ccd5d7f00+44d9ee3d90,g9d31334357+d3ce33c3e0,g9f33ca652e+9a8c17f5f6,gabe3b4be73+1e0a283bba,gabf8522325+94c30d56e9,gb1101e3267+90933e15fb,gb58c049af0+f03b321e39,gb89ab40317+fad15079a7,gc0af124501+26f6120d90,gcf25f946ba+f11a5d3b0b,gd6cbbdb0b4+8d7f1baacb,gd794735e4e+4bba874dfe,gdb1c4ca869+16879ca1a6,gde0f65d7ad+0609b2c34e,ge278dab8ac+4d6e48c014,ge410e46f29+fad15079a7,gf5e32f922b+fcb1d3bbc8,gf618743f1b+dd10d22602,gf67bdafdda+fad15079a7,w.2025.17
LSST Data Management Base Package
Loading...
Searching...
No Matches
lsst.afw.display.rgb._rgbContinued.AsinhZScaleMapping Class Reference
Inheritance diagram for lsst.afw.display.rgb._rgbContinued.AsinhZScaleMapping:
lsst.afw.display.rgb._rgbContinued.AsinhMapping lsst.afw.display.rgb._rgbContinued.Mapping

Public Member Functions

 __init__ (self, image, Q=8, pedestal=None)
 
 mapIntensityToUint8 (self, intensity)
 
 makeRgbImage (self, imageR=None, imageG=None, imageB=None, xSize=None, ySize=None, rescaleFactor=None)
 
 intensity (self, imageR, imageG, imageB)
 

Public Attributes

 minimum = minimum
 

Protected Member Functions

 _convertImagesToUint8 (self, imageR, imageG, imageB)
 

Protected Attributes

 _slope = self._uint8Max/Q
 
 _soften = Q/float(dataRange)
 
 _uint8Max = float(np.iinfo(np.uint8).max)
 
 _image = image
 

Detailed Description

A mapping for an asinh stretch, estimating the linear stretch by zscale

x = asinh(Q (I - z1)/(z2 - z1))/Q

Parameters
----------
image
    The image to analyse, or a list of 3 images to be converted to an intensity image
Q : `int`
    The asinh softening parameter
pedestal : `float` or sequence of `float`, optional
    The value, or array of 3 values, to subtract from the images

    N.b. pedestal, if not None, is removed from the images when calculating the zscale
    stretch, and added back into Mapping.minimum[]

See also
--------
AsinhMapping

Definition at line 324 of file _rgbContinued.py.

Constructor & Destructor Documentation

◆ __init__()

lsst.afw.display.rgb._rgbContinued.AsinhZScaleMapping.__init__ ( self,
image,
Q = 8,
pedestal = None )

Definition at line 346 of file _rgbContinued.py.

346 def __init__(self, image, Q=8, pedestal=None):
347 try:
348 assert len(image) in (1, 3,), "Please provide 1 or 3 images"
349 except TypeError:
350 image = [image]
351
352 if pedestal is not None:
353 try:
354 assert len(pedestal) in (
355 1, 3,), "Please provide 1 or 3 pedestals"
356 except TypeError:
357 pedestal = 3*[pedestal]
358
359 image = list(image) # needs to be mutable
360 for i, im in enumerate(image):
361 if pedestal[i] != 0.0:
362 if hasattr(im, "getImage"):
363 im = im.getImage()
364 if hasattr(im, "getArray"):
365 im = im.getArray()
366
367 image[i] = im - pedestal[i] # n.b. a copy
368 else:
369 pedestal = len(image)*[0.0]
370
371 image = computeIntensity(*image)
372
373 zscale = ZScaleMapping(image)
374 # zscale.minimum is always a triple
375 dataRange = zscale.maximum - zscale.minimum[0]
376 minimum = zscale.minimum
377
378 for i, level in enumerate(pedestal):
379 minimum[i] += level
380
381 AsinhMapping.__init__(self, minimum, dataRange, Q)
382 self._image = image # support self.makeRgbImage()
383
384

Member Function Documentation

◆ _convertImagesToUint8()

lsst.afw.display.rgb._rgbContinued.Mapping._convertImagesToUint8 ( self,
imageR,
imageG,
imageB )
protectedinherited
Use the mapping to convert images imageR, imageG, and imageB to a triplet of uint8 images

Definition at line 176 of file _rgbContinued.py.

176 def _convertImagesToUint8(self, imageR, imageG, imageB):
177 """Use the mapping to convert images imageR, imageG, and imageB to a triplet of uint8 images
178 """
179 imageR = imageR - self.minimum[0] # n.b. makes copy
180 imageG = imageG - self.minimum[1]
181 imageB = imageB - self.minimum[2]
182
183 fac = self.mapIntensityToUint8(self.intensity(imageR, imageG, imageB))
184
185 imageRGB = [imageR, imageG, imageB]
186 with np.errstate(invalid="ignore"): # suppress NAN warnings
187 for c in imageRGB:
188 c *= fac
189 # individual bands can still be < 0, even if fac isn't
190 c[c < 0] = 0
191
192 pixmax = self._uint8Max
193 # copies -- could work row by row to minimise memory usage
194 r0, g0, b0 = imageRGB
195
196 # n.b. np.where can't and doesn't short-circuit
197 with np.errstate(invalid='ignore', divide='ignore'):
198 for i, c in enumerate(imageRGB):
199 c = np.where(r0 > g0,
200 np.where(r0 > b0,
201 np.where(r0 >= pixmax, c*pixmax/r0, c),
202 np.where(b0 >= pixmax, c*pixmax/b0, c)),
203 np.where(g0 > b0,
204 np.where(g0 >= pixmax, c*pixmax/g0, c),
205 np.where(b0 >= pixmax, c*pixmax/b0, c))).astype(np.uint8)
206 c[c > pixmax] = pixmax
207
208 imageRGB[i] = c
209
210 return imageRGB
211
212

◆ intensity()

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

◆ makeRgbImage()

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()

lsst.afw.display.rgb._rgbContinued.AsinhMapping.mapIntensityToUint8 ( self,
intensity )
inherited
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

◆ _image

lsst.afw.display.rgb._rgbContinued.Mapping._image = image
protectedinherited

Definition at line 96 of file _rgbContinued.py.

◆ _slope

lsst.afw.display.rgb._rgbContinued.AsinhMapping._slope = self._uint8Max/Q
protectedinherited

Definition at line 307 of file _rgbContinued.py.

◆ _soften

lsst.afw.display.rgb._rgbContinued.AsinhMapping._soften = Q/float(dataRange)
protectedinherited

Definition at line 312 of file _rgbContinued.py.

◆ _uint8Max

lsst.afw.display.rgb._rgbContinued.Mapping._uint8Max = float(np.iinfo(np.uint8).max)
protectedinherited

Definition at line 87 of file _rgbContinued.py.

◆ minimum

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

Definition at line 95 of file _rgbContinued.py.


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