def load_and_prepare_images(): """Load images defined above and prepare them for the background analysis. Returns ------- - Img, plume image - Img, plume image vignetting corrected - Img, sky radiance image """ # get custom load method for ECII fun = pyplis.custom_image_import.load_ecII_fits # Load the image objects and peform dark correction plume, bg = pyplis.Img(PLUME_FILE, fun), pyplis.Img(BG_FILE, fun) dark, offset = pyplis.Img(DARK_FILE, fun), pyplis.Img(OFFSET_FILE, fun) # Model dark image for tExp of plume image dark_plume = pyplis.image.model_dark_image(plume.meta["texp"], dark, offset) # Model dark image for tExp of background image dark_bg = pyplis.image.model_dark_image(bg.meta["texp"], dark, offset) plume.subtract_dark_image(dark_plume) bg.subtract_dark_image(dark_bg) # Blur the images (sigma = 1) plume.add_gaussian_blurring(1) bg.add_gaussian_blurring(1) # Create vignetting correction mask from background image vign = bg.img / bg.img.max() # NOTE: potentially includes y & x gradients plume_vigncorr = pyplis.Img(plume.img / vign) return plume, plume_vigncorr, bg
def prepare_aa_image_list(bg_corr_mode=6): """Get and prepare onband list for aa image mode. The relevant gas free areas for background image modelling are set automatically (see also ex. 3 for details) :return: - on list in AA mode """ dataset = create_dataset() geom, _ = find_viewing_direction(dataset.meas_geometry, False) # Set plume background images for on and off # this is the same image which is also used for example script NO # demonstrating the plume background routines path_bg_on = join(IMG_DIR, 'EC2_1106307_1R02_2015091607022602_F01_Etna.fts') path_bg_off = join(IMG_DIR, 'EC2_1106307_1R02_2015091607022820_F02_Etna.fts') # Get on and off lists and activate dark correction lst = dataset.get_list("on") off_list = dataset.get_list("off") # Deactivate automatic reload in list while changing some list # attributes lst.auto_reload = False off_list.auto_reload = False lst.darkcorr_mode = True off_list.darkcorr_mode = True # Prepare on and offband background images bg_on = pyplis.Img(path_bg_on) bg_on.subtract_dark_image(lst.get_dark_image()) bg_off = pyplis.Img(path_bg_off) bg_off.subtract_dark_image(off_list.get_dark_image()) # set the background images within the lists lst.set_bg_img(bg_on) off_list.set_bg_img(bg_off) # automatically set gas free areas lst.bg_model.guess_missing_settings(lst.current_img()) # Now update some of the information from the automatically set sky ref # areas lst.bg_model.xgrad_line_startcol = 20 lst.bg_model.xgrad_line_rownum = 25 off_list.bg_model.xgrad_line_startcol = 20 off_list.bg_model.xgrad_line_rownum = 25 # set background modelling mode lst.bg_model.mode = bg_corr_mode off_list.bg_model.mode = bg_corr_mode lst.aa_mode = True # activate AA mode off_list.auto_reload = True lst.auto_reload = True print("INITIATED AA LIST") lst.meas_geometry = geom return lst
# object, meaning, that whenever something changes in "fl", it also does # in "aa_list.optflow") # Now activate optical flow calculation in list (this slows down the # speed of the analysis, since the optical flow calculation is # comparatively slow s = aa_list.optflow.settings s.hist_dir_gnum_max = 10 s.hist_dir_binres = 10 s.hist_sigma_tol = PEAK_SIGMA_TOL s.roi_rad = ROI_CONTRAST aa_list.optflow_mode = True plume_mask = pyplis.Img(aa_list.get_thresh_mask(MIN_AA)) plume_mask.show(tit="AA threshold mask") figs.append(analyse_and_plot(aa_list, LINES)) figs.append(fl.plot_flow_histograms(PCS1, plume_mask.img)) figs.append(fl.plot_flow_histograms(PCS2, plume_mask.img)) # Show an image containing plume speed magnitudes (ignoring direction) velo_img = pyplis.Img(fl.to_plume_speed(dist_img)) velo_img.show(vmin=0, vmax=10, cmap="Greens", tit="Optical flow plume velocities", zlabel="Plume velo [m/s]")
label=r"Uncorr: $\Phi_{SO2}=$%.2f (+/- %.2f) kg/s" % (phi_uncorr / 1000.0, phi_uncorr_err / 1000.0)) ax3.plot(so2_cds_corr, "-g", lw=3, label=r"Corr: $\Phi_{SO2}=$%.2f (+/- %.2f) kg/s" % (phi_corr / 1000.0, phi_corr_err / 1000.0)) ax3.set_title("Cross section profile", fontsize=12) ax3.legend(loc="best", framealpha=0.5, fancybox=True, fontsize=12) ax3.set_xlim([0, len(pix_dists_line)]) ax3.set_ylim([0, 5e18]) ax3.set_ylabel(r"$S_{SO2}$ [cm$^{-2}$]", fontsize=14) ax3.set_xlabel("PCS", fontsize=14) ax3.grid() # also plot plume pixel mask ax4 = pyplis.Img(plume_pix_mask).show(cmap="gray", tit="Plume pixel mask") if SAVEFIGS: ax = [ax0, ax1, ax2, ax3, ax4] for k in range(len(ax)): ax[k].set_title("") # remove titles for saving ax[k].figure.savefig(join(SAVE_DIR, "ex11_out_%d.%s" % (k, FORMAT)), format=FORMAT, dpi=DPI) basemap.ax.set_axis_off() basemap.ax.view_init(15, 345) basemap.ax.figure.savefig(join(SAVE_DIR, "ex11_out_5.%s" % FORMAT), format=FORMAT, dpi=DPI) # IMPORTANT STUFF FINISHED (Below follow tests and display options)
# add some blurring to the image img.add_gaussian_blurring(sigma_final=3) # crop the image edges roi_crop = [100, 100, 1244, 924] # [x0, y0, x1, y1] img.crop(roi_abs=roi_crop) # apply down scaling (gauss pyramid) img.to_pyrlevel(2) # ## Show image img.show() img.save_as_fits(SAVE_DIR, "ex0_1_imgsave_test") img_reload = pyplis.Img(join(SAVE_DIR, "ex0_1_imgsave_test.fts")) # print image information print(img) # ## IMPORTANT STUFF FINISHED - everything below is of minor importance # for educational purposes (options, args) = OPTPARSE.parse_args() # If applicable, do some tests. This is done only if TESTMODE is active: # testmode can be activated globally (see SETTINGS.py) or can also be # activated from the command line when executing the script using the # option --test 1 if int(options.test): import numpy.testing as npt
aa_list = prepare_aa_image_list() aa_list.pyrlevel = PYRLEVEL if DILCORR: aa_list.import_ext_coeffs_csv(EXT_ON) aa_list.get_off_list().import_ext_coeffs_csv(EXT_OFF) # Load DOAS calbration data and FOV information (see example 6) doascalib = pyplis.doascalib.DoasCalibData() doascalib.load_from_fits(file_path=CALIB_FILE) doascalib.fit_calib_data() # Load AA corr mask and set in image list(is normalised to DOAS FOV see # ex7) aa_corr_mask = pyplis.Img(CORR_MASK_FILE) aa_list.senscorr_mask = aa_corr_mask # set DOAS calibration data in image list aa_list.calib_data = doascalib ana = pyplis.EmissionRateAnalysis( imglist=aa_list, bg_roi=LOG_ROI_SKY, pcs_lines=pcs, velo_glob=PLUME_VELO_GLOB, velo_glob_err=PLUME_VELO_GLOB_ERR, ref_check_lower_lim=REF_CHECK_LOWER, ref_check_upper_lim=REF_CHECK_UPPER, velo_dir_multigauss=HISTO_ANALYSIS_MULTIGAUSS,
def bg_img_off(): return pyplis.Img(BG_FILE_OFF, FUN).to_pyrlevel(0)
# SCRIPT MAIN FUNCTION if __name__ == "__main__": close("all") ds = create_dataset() on = ds.get_list("on") on.darkcorr_mode = True on.gaussian_blurring = 2 # Find and plot sky reference areas on.bg_model.set_missing_ref_areas(on.current_img()) ax = on.bg_model.plot_sky_reference_areas(on.current_img()) # this is a beta version kernel = np.ones((90, 90), dtype=np.uint8) mask = on.prepare_bg_fit_mask(dilation=True, dilate_kernel=kernel, optflow_blur=0, optflow_median=10, i_min=1500, i_max=2600, plot_masks=True) mask = pyplis.Img(mask) ax2 = mask.show(tit="Input mask for surface fit") on.set_bg_img_from_polyfit(mask.img) ax3 = on.bg_img.show(tit="Surface fit result") on.bg_model.mode = 5 on.tau_mode = True on.show_current()
def bg_img_on(): return pyplis.Img(BG_FILE_ON, FUN).to_pyrlevel(0)
def plume_img_next(): return pyplis.Img(PLUME_FILE_NEXT, FUN).pyr_up(1)
def plume_img(): return pyplis.Img(PLUME_FILE, FUN).pyr_up(1)
ax0.set_xlim([0, 0.5]) # Get current AA image from image list aa_init = aa_list.current_img() # now determine sensitivity correction masks from the different cells masks = {} aa_imgs_corr = {} for cd in cell_aa_calib.cd_vec: mask = cellcalib.get_sensitivity_corr_mask("aa", pos_x_abs=fov_x, pos_y_abs=fov_y, radius_abs=fov_extend, cell_cd_closest=cd) masks[cd] = mask aa_imgs_corr[cd] = pyplis.Img(aa_init.img / mask.img) # get mask corresponding to minimum cell CD mask = list(masks.values())[np.argmin(list(masks.keys()))] # assing mask to aa_list aa_list.senscorr_mask = mask # activate AA sensitivity correction in list aa_list.sensitivity_corr_mode = True # set DOAS calibration data in list ... aa_list.calib_data = doascalib # ... and activate calibration mode aa_list.calib_mode = True
# convert the retrieval line to the specified pyramid level (script option) pcs = PCS.convert(to_pyrlevel=PYRLEVEL) # Load AA list # includes viewing direction corrected geometry aa_list = prepare_aa_image_list() aa_list.pyrlevel = PYRLEVEL # Load DOAS calbration data and FOV information (see example 6) doascalib = pyplis.doascalib.DoasCalibData() doascalib.load_from_fits(file_path=CALIB_FILE) doascalib.fit_calib_polynomial() # Load AA corr mask and set in image list(is normalised to DOAS FOV see # ex7) aa_corr_mask = pyplis.Img(CORR_MASK_FILE) aa_list.aa_corr_mask = aa_corr_mask # set DOAS calibration data in image list aa_list.calib_data = doascalib # you can check the settings first aa_list.gaussian_blurring = 1 aa_list.calib_mode = False aa_list.aa_mode = False raw_disp = aa_list.show_current() raw = aa_list.this.duplicate() raw_disp.set_title("") figs.append(raw_disp.figure) aa_list.calib_mode = True from cv2 import erode, dilate