def __call__(self, sample): scale = ZScaleInterval() vmin, vmax = scale.get_limits(sample['image'][0][200:800, 200:800]) newimage = (np.clip(sample['image'][0], vmin, vmax) - vmin) / (vmax - vmin) # deactivate stretching: linear stretch stretch = ContrastBiasStretch(contrast=0.5, bias=0.2) # SquaredStretch() newimage = stretch(newimage) newimage -= newimage[0, 0] newimage = LinearStretch()(newimage) * 512 return { 'image': newimage.reshape(1, *newimage.shape), 'clouds': sample['clouds'] }
def __call__(self, bounds=None): img = None visible_layers = 0 for uuid in sorted(self.layers, key=lambda x: self.layers[x]['zorder']): layer = self.layers[uuid] if not layer['visible']: continue interval = ManualInterval(*layer['clim']) contrast_bias = ContrastBiasStretch(layer['contrast'], layer['bias']) if callable(layer['array']): array = layer['array'](bounds=bounds) else: array = layer['array'] if array is None: continue if np.isscalar(array): scalar = True array = np.atleast_2d(array) else: scalar = False data = STRETCHES[layer['stretch']]()(contrast_bias( interval(array))) if isinstance(layer['color'], Colormap): if img is None: img = np.ones(data.shape + (4, )) # Compute colormapped image plane = layer['color'](data) alpha_plane = layer['alpha'] * plane[:, :, 3] # Use traditional alpha compositing plane[:, :, 0] = plane[:, :, 0] * alpha_plane plane[:, :, 1] = plane[:, :, 1] * alpha_plane plane[:, :, 2] = plane[:, :, 2] * alpha_plane img[:, :, 0] *= (1 - alpha_plane) img[:, :, 1] *= (1 - alpha_plane) img[:, :, 2] *= (1 - alpha_plane) img[:, :, 3] = 1 else: if img is None: img = np.zeros(data.shape + (4, )) # Get color and pre-multiply by alpha values color = COLOR_CONVERTER.to_rgba_array(layer['color'])[0] color *= layer['alpha'] # We should treat NaN values as zero (post-stretch), which means # that those pixels don't contribute towards the final image. reset = np.isnan(data) if np.any(reset): data[reset] = 0. plane = data[:, :, np.newaxis] * color plane[:, :, 3] = 1 visible_layers += 1 if scalar: plane = plane[0, 0] img += plane if img is None: return None else: img = np.clip(img, 0, 1) return img
def __getitem__(self, view): img = None visible_layers = 0 for uuid in sorted(self.layers, key=lambda x: self.layers[x]['zorder']): layer = self.layers[uuid] if not layer['visible']: continue interval = ManualInterval(*layer['clim']) contrast_bias = ContrastBiasStretch(layer['contrast'], layer['bias']) if callable(layer['array']): array = layer['array'](view=view) else: array = layer['array'] if array is None: continue if not callable(layer['array']): array = array[view] if np.isscalar(array): scalar = True array = np.atleast_2d(array) else: scalar = False data = STRETCHES[layer['stretch']]()(contrast_bias(interval(array))) if isinstance(layer['color'], Colormap): if img is None: img = np.ones(data.shape + (4,)) # Compute colormapped image plane = layer['color'](data) alpha_plane = layer['alpha'] * plane[:, :, 3] # Use traditional alpha compositing plane[:, :, 0] = plane[:, :, 0] * alpha_plane plane[:, :, 1] = plane[:, :, 1] * alpha_plane plane[:, :, 2] = plane[:, :, 2] * alpha_plane img[:, :, 0] *= (1 - alpha_plane) img[:, :, 1] *= (1 - alpha_plane) img[:, :, 2] *= (1 - alpha_plane) img[:, :, 3] = 1 else: if img is None: img = np.zeros(data.shape + (4,)) # Get color and pre-multiply by alpha values color = COLOR_CONVERTER.to_rgba_array(layer['color'])[0] color *= layer['alpha'] plane = data[:, :, np.newaxis] * color plane[:, :, 3] = 1 visible_layers += 1 if scalar: plane = plane[0, 0] img += plane if img is None: if self.shape is None: return None else: img = np.zeros(self.shape + (4,)) img = np.clip(img, 0, 1) return img