From c663b54f69dac3f7f171247b47e3df634e5eada1 Mon Sep 17 00:00:00 2001 From: Askaniy <44873271+Askaniy@users.noreply.github.com> Date: Tue, 20 Jul 2021 13:42:31 +0300 Subject: [PATCH] Image processing fixes and new features --- Scripts/TCT.py | 107 +++++++++++++++++++++++++-------------------- Scripts/strings.py | 5 +++ 2 files changed, 64 insertions(+), 48 deletions(-) diff --git a/Scripts/TCT.py b/Scripts/TCT.py index 4b648bb..a03fc12 100644 --- a/Scripts/TCT.py +++ b/Scripts/TCT.py @@ -103,30 +103,30 @@ def convert_to_bytes(img): T2_preview = (256, 128) T2_col1 = [ [sg.Text(tr.gui_input[lang], size=(17, 1), font=("arial", 12), key="T2_title1"), sg.Button(button_text="+", size=(2, 1), key="T2_+"), sg.Button(button_text="-", size=(2, 1), disabled=False, key="T2_-")], - [sg.Checkbox(tr.gui_single[lang], size=(22, 1), enable_events=True, key="T2_single")], - [sg.Input(size=(22, 1), disabled=True, disabled_readonly_background_color="#3A3A3A", key="T2_path"), sg.FileBrowse(button_text=tr.gui_browse[lang], size=(6, 1), disabled=True, key="T2_browse")], [frame(0)], [frame(1)], [frame(2)], [frame(3)], - [frame(4)] # just add more frames here + [frame(4)], + [frame(5)], + [frame(6)] # just add more frames here ] T2_col2 = [ [sg.Text(tr.gui_output[lang], size=(20, 1), font=("arial", 12), key="T2_title2")], [sg.Checkbox(tr.gui_gamma[lang], size=(20, 1), key="T2_gamma")], [sg.Checkbox("sRGB", size=(20, 1), key="T2_srgb")], [sg.HorizontalSeparator()], + [sg.Checkbox(tr.gui_single[lang], size=(22, 1), enable_events=True, key="T2_single")], + [sg.Input(size=(22, 1), disabled=True, disabled_readonly_background_color="#3A3A3A", key="T2_path"), sg.FileBrowse(button_text=tr.gui_browse[lang], size=(6, 1), disabled=True, key="T2_browse")], [sg.Checkbox(tr.gui_system[lang], size=(26, 1), enable_events=True, key="T2_system")], [sg.InputCombo(filters.get_sets(), size=(26, 1), enable_events=True, disabled=True, key="T2_filter")], - [sg.Checkbox(tr.gui_calib[lang], size=(26, 1), enable_events=True, key="T2_calib")], - [sg.InputCombo(list(obj_list().keys()), size=(26, 1), enable_events=True, disabled=True, key="T2_ref")], [sg.T("")], [sg.Text(tr.gui_folder[lang], key="T2_folderN")], [sg.Input(size=(27, 1), enable_events=True, key="T2_folder"), sg.FolderBrowse(button_text=tr.gui_browse[lang], size=(6, 1), key="T2_browse_folder")], [sg.Button(tr.gui_preview[lang], size=(15, 1), disabled=True, key="T2_show"), sg.Button(tr.gui_process[lang], size=(15, 1), disabled=True, key="T2_process")], [sg.Image(background_color="black", size=T2_preview, key="T2_preview")] ] -T2_num = len(T2_col1) - 5 +T2_num = len(T2_col1) - 1 T3_col1 = [ [sg.Text(tr.gui_settings[lang], size=(20, 1), font=("arial", 12), key="T3_title1")], @@ -220,7 +220,6 @@ def convert_to_bytes(img): window["T2_band"+str(i)].update(f"{tr.gui_band[lang]} {i+1}") #window["T2_gamma"].update(tr.gui_gamma[lang]) #window["T2_system"].update(tr.gui_system[lang]) - #window["T2_calib"].update(tr.gui_calib[lang]) window["T2_folderN"].update(tr.gui_folder[lang]) window["T2_browse_folder"].update(tr.gui_browse[lang]) window["T2_show"].update(tr.gui_preview[lang]) @@ -276,63 +275,63 @@ def convert_to_bytes(img): break if T1_spectrum["nm"][0] > T1_nm[0] or T1_spectrum["nm"][-1] < T1_nm[-1]: if values["T1_interp0"]: - curve = convert.DefaultExtrapolator(T1_spectrum["nm"], T1_spectrum["br"], T1_nm, T1_albedo) + T1_curve = convert.DefaultExtrapolator(T1_spectrum["nm"], T1_spectrum["br"], T1_nm, T1_albedo) elif values["T1_interp1"]: extrap = PchipInterpolator(T1_spectrum["nm"], T1_spectrum["br"], extrapolate=True) - curve = extrap(T1_nm) / extrap(550) * T1_albedo if T1_albedo else extrap(T1_nm) + T1_curve = extrap(T1_nm) / extrap(550) * T1_albedo if T1_albedo else extrap(T1_nm) elif values["T1_interp2"]: extrap = CubicSpline(T1_spectrum["nm"], T1_spectrum["br"], extrapolate=True) - curve = extrap(T1_nm) / extrap(550) * T1_albedo if T1_albedo else extrap(T1_nm) + T1_curve = extrap(T1_nm) / extrap(550) * T1_albedo if T1_albedo else extrap(T1_nm) else: - curve = interp(T1_nm) / interp(550) * T1_albedo if T1_albedo else interp(T1_nm) - curve = np.clip(curve, 0, None) + T1_curve = interp(T1_nm) / interp(550) * T1_albedo if T1_albedo else interp(T1_nm) + T1_curve = np.clip(T1_curve, 0, None) # Color calculation - T3_rgb = convert.to_rgb( - curve, mode=T1_mode, + T1_rgb = convert.to_rgb( + T1_curve, mode=T1_mode, albedo = T1_spectrum["albedo"] or T1_albedo, exp_bit=int(values["T1_bit_num"]), gamma=values["T1_gamma"], rnd=int(values["T1_rnd_num"]), srgb=values["T1_srgb"] ) - T3_rgb_show = convert.to_rgb( - curve, mode=T1_mode, + T1_rgb_show = convert.to_rgb( + T1_curve, mode=T1_mode, albedo = T1_spectrum["albedo"] or T1_albedo, gamma=values["T1_gamma"], srgb=values["T1_srgb"], html=True ) - if not np.array_equal(np.absolute(T3_rgb), T3_rgb): - T3_rgb_show = "#000000" + if not np.array_equal(np.absolute(T1_rgb), T1_rgb): + T1_rgb_show = "#000000" print("\n" + tr.error2[lang][0]) - print(tr.error2[lang][1].format(values["T1_list"][0], *T3_rgb) + "\n") + print(tr.error2[lang][1].format(values["T1_list"][0], *T1_rgb) + "\n") #break # Output try: - graph.TKCanvas.itemconfig(T1_preview, fill=T3_rgb_show) + graph.TKCanvas.itemconfig(T1_preview, fill=T1_rgb_show) except Exception as e: graph.TKCanvas.itemconfig(T1_preview, fill="#000000") print(e) - window["T1_rgb"].update(T3_rgb) - window["T1_hex"].update(T3_rgb_show) + window["T1_rgb"].update(T1_rgb) + window["T1_hex"].update(T1_rgb_show) elif event == "T1_add" and values["T1_list"] != []: names.append(values["T1_list"][0]) T1_fig.add_trace(go.Scatter( x = T1_nm, - y = curve, + y = T1_curve, name = values["T1_list"][0], - line = dict(color=T3_rgb_show, width=4) + line = dict(color=T1_rgb_show, width=4) )) elif event == "T1_plot": if len(names) == 1: - title_text = tr.single_title_text[lang] + names[0] + T1_title_text = tr.single_title_text[lang] + names[0] else: - title_text = tr.batch_title_text[lang] + ", ".join(names) - T1_fig.update_layout(title=title_text, xaxis_title=tr.xaxis_text[lang], yaxis_title=tr.yaxis_text[lang]) + T1_title_text = tr.batch_title_text[lang] + ", ".join(names) + T1_fig.update_layout(title=T1_title_text, xaxis_title=tr.xaxis_text[lang], yaxis_title=tr.yaxis_text[lang]) T1_fig.show() elif event == "T1_export": @@ -363,20 +362,20 @@ def convert_to_bytes(img): break if T1_spectrum["nm"][0] > T1_nm[0] or T1_spectrum["nm"][-1] < T1_nm[-1]: if values["T1_interp0"]: - curve = convert.DefaultExtrapolator(T1_spectrum["nm"], T1_spectrum["br"], T1_nm, T1_albedo) + T1_curve = convert.DefaultExtrapolator(T1_spectrum["nm"], T1_spectrum["br"], T1_nm, T1_albedo) elif values["T1_interp1"]: extrap = PchipInterpolator(T1_spectrum["nm"], T1_spectrum["br"], extrapolate=True) - curve = extrap(T1_nm) / extrap(550) * T1_albedo if T1_albedo else extrap(T1_nm) + T1_curve = extrap(T1_nm) / extrap(550) * T1_albedo if T1_albedo else extrap(T1_nm) elif values["T1_interp2"]: extrap = CubicSpline(T1_spectrum["nm"], T1_spectrum["br"], extrapolate=True) - curve = extrap(T1_nm) / extrap(550) * T1_albedo if T1_albedo else extrap(T1_nm) + T1_curve = extrap(T1_nm) / extrap(550) * T1_albedo if T1_albedo else extrap(T1_nm) else: - curve = interp(T1_nm) / interp(550) * T1_albedo if T1_albedo else interp(T1_nm) - curve = np.clip(curve, 0, None) + T1_curve = interp(T1_nm) / interp(550) * T1_albedo if T1_albedo else interp(T1_nm) + T1_curve = np.clip(T1_curve, 0, None) # Color calculation - T3_rgb = convert.to_rgb( - curve, mode=T1_mode, + T1_rgb = convert.to_rgb( + T1_curve, mode=T1_mode, albedo = T1_spectrum["albedo"] or T1_albedo, exp_bit=int(values["T1_bit_num"]), gamma=values["T1_gamma"], @@ -385,7 +384,7 @@ def convert_to_bytes(img): ) # Output - print("\t".join([str(i) for i in T3_rgb]) + "\t" + name_1) + print("\t".join([str(i) for i in T1_rgb]) + "\t" + name_1) # Events in tab "Images" @@ -418,9 +417,6 @@ def convert_to_bytes(img): i = event[-1] window["T2_wavelength"+i].update(filters.get_param(values["T2_filter"], values["T2_filter"+i], "L_mean")) - elif event == "T2_calib": - window["T2_ref"].update(disabled=not values["T2_calib"]) - elif event == "T2_folder": window["T2_process"].update(disabled=False) @@ -469,7 +465,7 @@ def convert_to_bytes(img): if values["T2_path"] == "": raise ValueError("Path is empty") T2_rgb_img = Image.open(values["T2_path"]) - if event == "show": + if event == "T2_show": T2_rgb_img = T2_rgb_img.resize(T2_preview, resample=Image.HAMMING) if len(T2_rgb_img.getbands()) == 3: r, g, b = T2_rgb_img.split() @@ -482,24 +478,29 @@ def convert_to_bytes(img): for i in range(T2_vis): if values["T2_path"+str(i)] == "": raise ValueError(f'Path {i+1} is empty') - bw_img = Image.open(values["T2_path"+str(i)]) - if event == "show": - bw_img = bw_img.resize(T2_preview, resample=Image.HAMMING) - if len(bw_img.getbands()) != 1: + T2_bw_img = Image.open(values["T2_path"+str(i)]) + if event == "T2_show": + T2_bw_img = T2_bw_img.resize(T2_preview, resample=Image.HAMMING) + if len(T2_bw_img.getbands()) != 1: raise TypeError("Band image should be b/w") - load.append(np.array(bw_img)) + load.append(np.array(T2_bw_img)) - T2_data = np.array(load, dtype="float64") + T2_data = np.array(load, dtype="float32") T2_l = T2_data.shape[0] # number of maps T2_h = T2_data.shape[1] # height of maps T2_w = T2_data.shape[2] # width of maps - - if T2_data.max() > 255: + + T2_max = T2_data.max() + if T2_max > 256: T2_bit = 16 T2_depth = 65535 + elif T2_max < 2: + T2_bit = 0 + T2_depth = 1 else: T2_bit = 8 T2_depth = 255 + T2_data = np.clip(T2_data, 0, T2_depth) # Calibration of maps by spectrum (legasy) #if info["calib"]: @@ -527,6 +528,9 @@ def convert_to_bytes(img): T2_draw = ImageDraw.Draw(T2_img) counter = 0 px_num = T2_w*T2_h + + T2_fig = go.Figure() + T2_fig.update_layout(title=tr.map_title_text[lang], xaxis_title=tr.xaxis_text[lang], yaxis_title=tr.yaxis_text[lang]) for x in range(T2_w): for y in range(T2_h): @@ -535,10 +539,17 @@ def convert_to_bytes(img): T2_curve = convert.DefaultExtrapolator(input_data["nm"], list(T2_spectrum), T2_nm) T2_rgb = convert.to_rgb(T2_curve, mode="albedo", albedo=True, inp_bit=T2_bit, exp_bit=8, gamma=input_data["gamma"]) T2_draw.point((x, y), T2_rgb) + if x % 32 == 0 and y % 32 == 0: + T2_fig.add_trace(go.Scatter( + x = T2_nm, + y = T2_curve, + name = px_num, + line = dict(color="rgb"+str(T2_rgb), width=2) + )) counter += 1 sg.OneLineProgressMeter("Progress", counter, px_num) - #img.show() + T2_fig.show() if event == "T2_show": window["T2_preview"].update(data=convert_to_bytes(T2_img)) else: diff --git a/Scripts/strings.py b/Scripts/strings.py index d09a504..7c58f1d 100644 --- a/Scripts/strings.py +++ b/Scripts/strings.py @@ -304,6 +304,11 @@ "ru": "Спектры и цвета космических объектов", "de": "" } +map_title_text = { + "en": "Spectrum and color of some pixels of the map", + "ru": "Спектр и цвет некоторых пикселей карты", + "de": "" +} xaxis_text = { "en": "Wavelength [nm]", "ru": "Длина волны [нм]",