def _data_stretch(image, vmin=None, vmax=None, pmin=0.25, pmax=99.75, stretch='linear', vmid=None, exponent=2): if vmin is None or vmax is None: interval = AsymmetricPercentileInterval(pmin, pmax, n_samples=10000) try: vmin_auto, vmax_auto = interval.get_limits(image) except IndexError: # no valid values vmin_auto = vmax_auto = 0 if vmin is None: vmin = vmin_auto if vmax is None: vmax = vmax_auto normalizer = simple_norm(image, stretch=stretch, power=exponent, asinh_a=vmid, min_cut=vmin, max_cut=vmax, clip=False) data = normalizer(image, clip=True).filled(0) data = np.nan_to_num(data) data = np.clip(data * 255., 0., 255.) return data.astype(np.uint8)
def _data_stretch(image, vmin=None, vmax=None, pmin=0.25, pmax=99.75, stretch='linear', vmid=None, exponent=2): if vmin is None or vmax is None: interval = AsymmetricPercentileInterval(pmin, pmax, n_samples=10000) try: vmin_auto, vmax_auto = interval.get_limits(image) except IndexError: # no valid values vmin_auto = vmax_auto = 0 if vmin is None: log.info("vmin = %10.3e (auto)" % vmin_auto) vmin = vmin_auto else: log.info("vmin = %10.3e" % vmin) if vmax is None: log.info("vmax = %10.3e (auto)" % vmax_auto) vmax = vmax_auto else: log.info("vmax = %10.3e" % vmax) if stretch == 'arcsinh': stretch = 'asinh' normalizer = simple_norm(image, stretch=stretch, power=exponent, asinh_a=vmid, min_cut=vmin, max_cut=vmax, clip=False) data = normalizer(image, clip=True).filled(0) data = np.nan_to_num(data) data = np.clip(data * 255., 0., 255.) return data.astype(np.uint8)
def build_image(id_, set_, bands=['EUC_VIS', 'EUC_H', 'EUC_J', 'EUC_Y'], img_size=200, scale=100, clip=True): tables = [] data = np.empty((img_size, img_size, len(bands))) for i, band in enumerate(bands): fname = get_image_filename_from_id(id_, band, set_) try: tables.append(fits.open(fname)) except FileNotFoundError as fe: raise if band != 'EUC_VIS': band_data, data_footprint = reproject_interp( tables[i][0], tables[0][0].header) else: band_data = tables[0][0].data band_data[np.isnan(band_data)] = 0. if clip: interval = AsymmetricPercentileInterval(0.25, 99.75, n_samples=100000) vmin, vmax = interval.get_limits(band_data) stretch = MinMaxInterval() + LogStretch() data[:, :, i] = stretch( ((np.clip(band_data, -vmin * 0.7, vmax)) / (vmax))) else: stretch = LogStretch() + MinMaxInterval() data[:, :, i] = stretch(band_data) for t in tables: t.close() return data.astype(np.float32)
def stretchImage(self, image=None): """ stretchImage take the actual image and calculated norm based on the min, max derived from interval which is calculated with AsymmetricPercentileInterval. :param image: image :return: norm for plot """ if image is None: return None values = self.stretchValues[self.ui.stretch.currentText()] interval = AsymmetricPercentileInterval(*values) vmin, vmax = interval.get_limits(image) # cutout the noise delta = vmax - vmin vmin = min(vmin + delta * 0.01, vmax) norm = ImageNormalize(image, vmin=vmin, vmax=vmax, stretch=SqrtStretch(), ) return norm, vmin, vmax
def make_thumbnail(a, ttype, ztftype): cutout_data = a[f"cutout{ztftype}"]["stampData"] with gzip.open(io.BytesIO(cutout_data), "rb") as f: with fits.open(io.BytesIO(f.read())) as hdu: # header = hdu[0].header data_flipped_y = np.flipud(hdu[0].data) # fixme: png, switch to fits eventually buff = io.BytesIO() plt.close("all") fig = plt.figure() fig.set_size_inches(4, 4, forward=False) ax = plt.Axes(fig, [0.0, 0.0, 1.0, 1.0]) ax.set_axis_off() fig.add_axes(ax) # replace nans with median: img = np.array(data_flipped_y) # replace dubiously large values xl = np.greater(np.abs(img), 1e20, where=~np.isnan(img)) if img[xl].any(): img[xl] = np.nan if np.isnan(img).any(): median = float(np.nanmean(img.flatten())) img = np.nan_to_num(img, nan=median) norm = ImageNormalize( img, stretch=LinearStretch() if ztftype == "Difference" else LogStretch()) img_norm = norm(img) normalizer = AsymmetricPercentileInterval(lower_percentile=1, upper_percentile=100) vmin, vmax = normalizer.get_limits(img_norm) ax.imshow(img_norm, cmap="bone", origin="lower", vmin=vmin, vmax=vmax) plt.savefig(buff, dpi=42) buff.seek(0) plt.close("all") thumb = { "obj_id": a["objectId"], "data": base64.b64encode(buff.read()).decode("utf-8"), "ttype": ttype, } return thumb
def preprocess_band(image, clip=True): """Do clip preprocessing of a single band. param: image (ndarray): 2D array containing a single band's data. param: clip (bool): Whether or not to do clip preprocessing. if False log-stretches the image. Defaults to True. returns: newimage (ndarray): Preprocessed 2D array.""" image[np.isnan(image)] = 0. if clip: interval = AsymmetricPercentileInterval(0.25, 99.75, n_samples=100000) vmin, vmax = interval.get_limits(image) stretch = MinMaxInterval() + LogStretch() newimage = stretch(((np.clip(image, -vmin * 0.7, vmax)) / (vmax))) else: stretch = LogStretch() + MinMaxInterval() newimage = stretch(image) return newimage
def _data_stretch( image, vmin=None, vmax=None, pmin=0.25, pmax=99.75, stretch='linear', vmid: float = 10, exponent=2): """ Hacked from aplpy """ if vmin is None or vmax is None: interval = AsymmetricPercentileInterval(pmin, pmax, n_samples=10000) try: vmin_auto, vmax_auto = interval.get_limits(image) except IndexError: # no valid values vmin_auto = vmax_auto = 0 if vmin is None: #log.info("vmin = %10.3e (auto)" % vmin_auto) vmin = vmin_auto else: pass #log.info("vmin = %10.3e" % vmin) if vmax is None: #log.info("vmax = %10.3e (auto)" % vmax_auto) vmax = vmax_auto else: pass #log.info("vmax = %10.3e" % vmax) if stretch == 'arcsinh': stretch = 'asinh' normalizer = simple_norm( image, stretch=stretch, power=exponent, asinh_a=vmid, min_cut=vmin, max_cut=vmax, clip=False) data = normalizer(image, clip=True).filled(0) data = np.nan_to_num(data) data = np.clip(data * 255., 0., 255.) return data.astype(np.uint8)