Spaces:
Sleeping
Sleeping
File size: 5,450 Bytes
d1d7e79 74c1022 ff6d288 d1d7e79 22fd21f ff6d288 22fd21f 74c1022 22fd21f ff6d288 d1d7e79 74c1022 22fd21f 74c1022 ff6d288 d1d7e79 0deb2e3 d1d7e79 0deb2e3 ff6d288 0deb2e3 ff6d288 d1d7e79 ff6d288 80623b8 ff6d288 22fd21f ff6d288 22fd21f ff6d288 22fd21f ff6d288 d1d7e79 80623b8 d1d7e79 22fd21f ff6d288 d1d7e79 80623b8 d1d7e79 ff6d288 d1d7e79 ff6d288 d1d7e79 74c1022 22fd21f ff6d288 d1d7e79 74c1022 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | import os
import gradio as gr
import matplotlib.pyplot as plt
#from fraunhofer_test import generate_diff
from zern_generator import Zernike
from fraunhofer_test import Fraunhofer
from PIL import Image
import numpy as np
import shutil
css = """
.container {
# height: 50vh;
# width: 100%;
# overflow-x: auto !important;
# overflow-y: auto !important;
# scrollbar-width: thin !important;
}
"""
zerns = {}
def update_zerns(key, value):
global zerns
zerns[key] = value
def get_zern_from_file(file):
with open(file) as f:
coeffs = [float(l) for l in f]
return tuple(coeffs)
zernike = Zernike()
fraunhofer = Fraunhofer(zernike)
curr_diff = None
theme = gr.themes.Default(primary_hue=gr.themes.colors.red, secondary_hue=gr.themes.colors.pink)
with gr.Blocks(theme=theme, css=css) as demo:
with gr.Row():
zern_sliders = []
with gr.Column(scale=1):
with gr.Tab(label="Генератор"):
defocus_amt = gr.Number(
label="Величина дефокуса",
value=2,
interactive=True
)
with gr.Row():
num_zernikes = gr.Number(
label="Количество коэффициентов Цернике",
value=6,
interactive=True
)
show_zernikes_btn = gr.Button("Показать")
sliders_container = gr.Column(elem_classes=["container"])
@gr.render(inputs=[num_zernikes], triggers=[show_zernikes_btn.click])
def render_count(count):
global zerns
zerns = {}
sliders_container.children.clear()
count = min(count, 100)
for i in range(count):
term_name = f" - {zernike.term[i]}" if i < len(zernike.term) else ""
sld = gr.Slider(
key=i,
label=f"Zernike {i+1}{term_name}",
minimum=-100,
interactive=True,
step=0.01,
value=0
)
sld.change(update_zerns, inputs=[gr.Number(value=i, visible=False), sld])
sliders_container.add_child(sld)
return gr.update()
with gr.Tab(label="Настройки"):
resolution_num = gr.Number(value=256, label="Разрешение")
with gr.Column(scale=5):
with gr.Tab(label="Экран"):
with gr.Row():
plot_2d = gr.Plot()
plot_3d = gr.Plot()
btn = gr.Button("Рассчитать")
with gr.Tab(label="Тестовые экраны"):
plot_batch = gr.Plot(label="Тестовые экраны (ANSI scheme)")
btn_batch = gr.Button("Рассчитать тестовые экраны")
with gr.Tab(label="Разница у фокуса"):
plot_diff = gr.Plot(label="Разница в фокусе")
btn_diff = gr.Button("Рассчитать разницу в фокусе")
file_download = gr.File(label="Скачать")
def on_button_click(resolution):
return zernike.generate_zern_wavefront_fig(*[zerns[key] for key in sorted(zerns)])
def on_settings_click(resolution):
print(resolution)
zernike.set_image_params(npix=resolution)
def on_diff_button_click(defocus_amount):
shutil.rmtree("temp", ignore_errors=True)
os.makedirs("temp")
global curr_diff
pl, mn, diff = fraunhofer.generate_diff(defocus_amount, *[zerns[key] for key in sorted(zerns)])
curr_diff = diff
fig, axs = plt.subplots(1, 3, figsize = (20, 10))
axs[0].imshow(pl, cmap='grey')
axs[1].imshow(mn, cmap='grey')
axs[2].imshow(diff, cmap='grey')
axs[0].axis('off')
axs[0].set_title(f"+{defocus_amount}")
axs[1].axis('off')
axs[1].set_title(f"-{defocus_amount}")
axs[2].axis('off')
axs[2].set_title(f"Difference")
a = np.min(curr_diff)
b = np.max(curr_diff)
img_arr = ((curr_diff - a) / (b - a) * 255).astype(np.uint8)
img = Image.fromarray(np.stack([img_arr] * 3, axis=-1), mode='RGB')
z = [str(zerns[key]) for key in sorted(zerns)]
filename = f'temp/{"_".join(z[1:])}.png'
img.save(filename)
return fig, filename
btn.click(on_button_click, inputs=[resolution_num], outputs=[plot_2d, plot_3d])
btn_batch.click(zernike.generate_batch, inputs=[resolution_num], outputs=[plot_batch])
resolution_num.change(on_settings_click, inputs=[resolution_num])
btn_diff.click(on_diff_button_click, inputs=[defocus_amt], outputs=[plot_diff, file_download])
demo.launch()
|