HuguesdeF commited on
Commit
c198cf5
·
1 Parent(s): 671bf4d

Removed authentication

Browse files
Files changed (1) hide show
  1. Corriger.py +141 -156
Corriger.py CHANGED
@@ -7,8 +7,6 @@ import cv2
7
  import numpy as np
8
  from io import BytesIO
9
  import copy
10
- import yaml
11
- from yaml.loader import SafeLoader
12
 
13
  logo = Image.open("seguinmoreau.png")
14
  st.set_page_config(
@@ -18,160 +16,147 @@ st.set_page_config(
18
  initial_sidebar_state="expanded"
19
  )
20
 
21
- # Authentication
22
-
23
- with open('users.yaml') as file:
24
- config = yaml.load(file, Loader=SafeLoader)
25
-
26
- authenticator = stauth.Authenticate(
27
- config['credentials'],
28
- config['cookie']['name'],
29
- config['cookie']['key'],
30
- config['cookie']['expiry_days'],
31
- config['preauthorized']
 
 
 
 
 
 
 
 
 
 
32
  )
33
 
34
- name, authentication_status, username = authenticator.login('Login', 'main')
35
-
36
- if not authentication_status:
37
- st.error("Nom d'utilisateur ou mot de passe incorrect")
38
- elif authentication_status is None:
39
- st.warning("Rentrer nom d'utilisateur et mot de passe")
40
- elif authentication_status:
41
- authenticator.logout('Logout', 'main')
42
- # ------------------------------
43
-
44
- inch_value = 2.54
45
-
46
- logo = Image.open('seguinmoreau.png')
47
- st.image(logo, width=200)
48
- st.markdown(
49
- """
50
- # Boîte à Outils de correction de logos :wrench:
51
-
52
- Bienvenue dans la boîte à outils de correction de logos de Seguin Moreau.
53
-
54
- ### :hammer: Les outils
55
- Dans cette boîte à outils, vous trouverez:
56
- * Un outil de Correction automatique de logo (enlever les petits défauts, lissage, vectorisation, grossissement des traits trop fins).
57
-
58
- ### :bulb: Mode d'emploi
59
- * Cliquer sur 'Browse files'
60
- * Sélectionner un logo
61
- * La correction est automatique. Si la correction ne vous convient pas, il est possible de régler les paramètres en cliquant sur 'Paramétrage' à droite de l'image.
62
- * Les deux paramètres permettent de corriger les défauts liés à la présence de gris sur le logo ou la 'pixélisation' du logo trop importante.
63
-
64
- """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  )
66
-
67
- uploaded_files = st.file_uploader("Choisir un logo", accept_multiple_files=True)
68
-
69
- image_width = 500
70
- size_value = st.slider("Largeur de trait minimum", min_value=1, max_value=21, value=7, step=2)
71
-
72
- size_value = (size_value - 1) // 2
73
-
74
- # kernel_type_str = st.selectbox("Kernel type", ["Ellipse", "Rectangle", "Cross"])
75
- kernel_type_str = "Ellipse"
76
- dict_kernel_type = {"Ellipse": cv2.MORPH_ELLIPSE, "Rectangle": cv2.MORPH_RECT, "Cross": cv2.MORPH_CROSS}
77
- kernel_type = dict_kernel_type[kernel_type_str]
78
-
79
- for uploaded_file in uploaded_files:
80
- col1, col2, col3 = st.columns([1, 1, 1])
81
- col3.markdown("---")
82
-
83
- image = Image.open(uploaded_file).convert('L')
84
- image_input = np.array(image)
85
- image = copy.deepcopy(image_input)
86
- col1.image(image_input / 255.0, caption="Image d'entrée", use_column_width='auto')
87
-
88
- with col3:
89
- with st.expander(":gear: Paramétrage"):
90
- st.write("Si l'image contient du gris, faire varier le seuil ci-dessous:")
91
- threshold = st.slider("Seuil pour convertir l'image en noir&blanc.", min_value=0, max_value=255,
92
- value=0,
93
- step=1, key=f"{uploaded_file}_slider_threshold")
94
- st.write("Si l'image est pixelisée, ou contient trop de détails, "
95
- "augmenter la valeur ci-dessous:")
96
- blur_value = st.slider("Seuil pour lisser l'image", min_value=1, max_value=11, value=1, step=2,
97
- key=f"{uploaded_file}_slider_gaussian_sigma")
98
- st.write("Si l'image contient des traits très fin (de l'odre du pixel),"
99
- " augmenter le seuil ci-dessous, de 1 par 1:")
100
- dilate_lines_value = st.slider("Dilatation de l'image d'origine: (en pixels)", min_value=0, max_value=5,
101
- value=0, step=1, key=f"{uploaded_file}_slider_dilation_image")
102
-
103
- st.write("Taille d'exportation d'image:")
104
-
105
- dpi_value = st.number_input("Valeur dpi:", key=f"{uploaded_file}_number_dpi_value", value=200)
106
- side_width_value = st.number_input("Taille max de côté cible (cm):",
107
- key=f"{uploaded_file}_number_target_value", value=20)
108
- new_largest_side_value = int(side_width_value / inch_value * dpi_value)
109
-
110
- h, w, *_ = image.shape
111
-
112
- # Resize image
113
- ratio = w / h
114
- if ratio > 1:
115
- width = new_largest_side_value
116
- height = int(new_largest_side_value / ratio)
117
- else:
118
- height = new_largest_side_value
119
- width = int(ratio * new_largest_side_value)
120
-
121
- target_width_value = st.number_input("Largeur cible (cm):", key=f"{uploaded_file}_number_width_value",
122
- value=0)
123
- target_height_value = st.number_input("Hauteur cible (cm):", key=f"{uploaded_file}_number_height_value",
124
- value=0)
125
-
126
- if target_width_value > 0 and target_height_value == 0:
127
- width = int(target_width_value / inch_value * dpi_value)
128
- height = int(width / ratio)
129
- elif target_height_value > 0 and target_width_value == 0:
130
- height = int(target_height_value / inch_value * dpi_value)
131
- width = int(height * ratio)
132
- elif target_height_value > 0 and target_width_value > 0:
133
- st.warning("Vous ne pouvez pas modifier la largeur et la hauteur simultanément.")
134
-
135
- if threshold > 0:
136
- image = (image > threshold) * 255
137
- image = image.astype('uint8')
138
-
139
- if blur_value > 0:
140
- image = cv2.GaussianBlur(image, (blur_value, blur_value), blur_value - 1)
141
-
142
- # Process image cv32f ==> cv32f
143
- img_final = pipeline_svg(image, size_value=size_value, level=1, threshold=threshold, kernel_type=kernel_type,
144
- dilate_lines_value=dilate_lines_value)
145
-
146
- col2.image(img_final, caption="Image corrigée", use_column_width='auto')
147
-
148
- # Check for grayscale
149
- tolerance = 10
150
- ratio_of_gray_pixels = int(np.sum((tolerance < image) * (image < 255 - tolerance)) / np.size(image) * 100)
151
- if ratio_of_gray_pixels > 1:
152
- col3.warning(f":warning: Le nombre de pixels gris est élevé: {ratio_of_gray_pixels} % > 1%")
153
-
154
- # Check reconstruction fidelity
155
- distance = np.mean((np.array(image) - img_final) ** 2)
156
- if distance > 10:
157
- col3.warning(
158
- f":warning: Le logo est peut-être trop dégradé (MSE={distance:.2f} > 10).\nVérifier visuellement.")
159
-
160
- dim = (width, height)
161
- # resize image
162
- resized_img_final = cv2.resize(img_final, dim, interpolation=cv2.INTER_AREA)
163
- resized_image_input = cv2.resize(image_input, dim, interpolation=cv2.INTER_AREA)
164
-
165
- buf = BytesIO()
166
- # img_stacked = np.hstack((resized_image_input, resized_img_final))
167
- img_final = Image.fromarray(resized_img_final).convert("L")
168
-
169
- img_final.save(buf, format="PNG")
170
- byte_im = buf.getvalue()
171
-
172
- btn = col3.download_button(
173
- label=":inbox_tray: Télécharger l'image",
174
- data=byte_im,
175
- file_name=f"corrected_{uploaded_file.name}",
176
- mime="image/png"
177
- )
 
7
  import numpy as np
8
  from io import BytesIO
9
  import copy
 
 
10
 
11
  logo = Image.open("seguinmoreau.png")
12
  st.set_page_config(
 
16
  initial_sidebar_state="expanded"
17
  )
18
 
19
+ inch_value = 2.54
20
+
21
+ logo = Image.open('seguinmoreau.png')
22
+ st.image(logo, width=200)
23
+ st.markdown(
24
+ """
25
+ # Boîte à Outils de correction de logos :wrench:
26
+
27
+ Bienvenue dans la boîte à outils de correction de logos de Seguin Moreau.
28
+
29
+ ### :hammer: Les outils
30
+ Dans cette boîte à outils, vous trouverez:
31
+ * Un outil de Correction automatique de logo (enlever les petits défauts, lissage, vectorisation, grossissement des traits trop fins).
32
+
33
+ ### :bulb: Mode d'emploi
34
+ * Cliquer sur 'Browse files'
35
+ * Sélectionner un logo
36
+ * La correction est automatique. Si la correction ne vous convient pas, il est possible de régler les paramètres en cliquant sur 'Paramétrage' à droite de l'image.
37
+ * Les deux paramètres permettent de corriger les défauts liés à la présence de gris sur le logo ou la 'pixélisation' du logo trop importante.
38
+
39
+ """
40
  )
41
 
42
+ uploaded_files = st.file_uploader("Choisir un logo", accept_multiple_files=True)
43
+
44
+ image_width = 500
45
+ size_value = st.slider("Largeur de trait minimum", min_value=1, max_value=21, value=7, step=2)
46
+
47
+ size_value = (size_value - 1) // 2
48
+
49
+ # kernel_type_str = st.selectbox("Kernel type", ["Ellipse", "Rectangle", "Cross"])
50
+ kernel_type_str = "Ellipse"
51
+ dict_kernel_type = {"Ellipse": cv2.MORPH_ELLIPSE, "Rectangle": cv2.MORPH_RECT, "Cross": cv2.MORPH_CROSS}
52
+ kernel_type = dict_kernel_type[kernel_type_str]
53
+
54
+ for uploaded_file in uploaded_files:
55
+ col1, col2, col3 = st.columns([1, 1, 1])
56
+ col3.markdown("---")
57
+
58
+ image = Image.open(uploaded_file).convert('L')
59
+ image_input = np.array(image)
60
+ image = copy.deepcopy(image_input)
61
+ col1.image(image_input / 255.0, caption="Image d'entrée", use_column_width='auto')
62
+
63
+ with col3:
64
+ with st.expander(":gear: Paramétrage"):
65
+ st.write("Si l'image contient du gris, faire varier le seuil ci-dessous:")
66
+ threshold = st.slider("Seuil pour convertir l'image en noir&blanc.", min_value=0, max_value=255,
67
+ value=0,
68
+ step=1, key=f"{uploaded_file}_slider_threshold")
69
+ st.write("Si l'image est pixelisée, ou contient trop de détails, "
70
+ "augmenter la valeur ci-dessous:")
71
+ blur_value = st.slider("Seuil pour lisser l'image", min_value=1, max_value=11, value=1, step=2,
72
+ key=f"{uploaded_file}_slider_gaussian_sigma")
73
+ st.write("Si l'image contient des traits très fin (de l'odre du pixel),"
74
+ " augmenter le seuil ci-dessous, de 1 par 1:")
75
+ dilate_lines_value = st.slider("Dilatation de l'image d'origine: (en pixels)", min_value=0, max_value=5,
76
+ value=0, step=1, key=f"{uploaded_file}_slider_dilation_image")
77
+
78
+ st.write("Taille d'exportation d'image:")
79
+
80
+ dpi_value = st.number_input("Valeur dpi:", key=f"{uploaded_file}_number_dpi_value", value=200)
81
+
82
+ st.write("---")
83
+ st.write("Spécifier la taille maximum d'un côté, en cm:")
84
+ side_width_value = st.number_input("Taille max de côté cible (cm):",
85
+ key=f"{uploaded_file}_number_target_value", value=20.0)
86
+ new_largest_side_value = int(side_width_value / inch_value * dpi_value)
87
+
88
+ h, w, *_ = image.shape
89
+
90
+ # Resize image
91
+ ratio = w / h
92
+ if ratio > 1:
93
+ width = new_largest_side_value
94
+ height = int(width / ratio)
95
+ else:
96
+ height = new_largest_side_value
97
+ width = int(ratio * height)
98
+
99
+ st.write("---")
100
+ st.write("Ou, spécifier la largeur OU la hauteur cible, en cm:")
101
+
102
+ target_width_value = st.number_input("Largeur cible (cm):", key=f"{uploaded_file}_number_width_value",
103
+ value=0.0)
104
+ target_height_value = st.number_input("Hauteur cible (cm):", key=f"{uploaded_file}_number_height_value",
105
+ value=0.0)
106
+
107
+ if target_width_value > 0 and target_height_value == 0:
108
+ width = int(target_width_value / inch_value * dpi_value)
109
+ height = int(width / ratio)
110
+ elif target_height_value > 0 and target_width_value == 0:
111
+ height = int(target_height_value / inch_value * dpi_value)
112
+ width = int(height * ratio)
113
+ elif target_height_value > 0 and target_width_value > 0:
114
+ st.warning("Vous ne pouvez pas modifier la largeur et la hauteur simultanément.")
115
+
116
+ st.info(f"Le logo sera redimensionné de :")
117
+ st.info(f"hauteur={h} pixels et largeur={w} pixels vers "
118
+ f"hauteur={height} pixels et largeur={width} pixels.")
119
+
120
+ if threshold > 0:
121
+ image = (image > threshold) * 255
122
+ image = image.astype('uint8')
123
+
124
+ if blur_value > 0:
125
+ image = cv2.GaussianBlur(image, (blur_value, blur_value), blur_value - 1)
126
+
127
+ # Process image cv32f ==> cv32f
128
+ img_final = pipeline_svg(image, size_value=size_value, level=1, threshold=threshold, kernel_type=kernel_type,
129
+ dilate_lines_value=dilate_lines_value)
130
+
131
+ col2.image(img_final, caption="Image corrigée", use_column_width='auto')
132
+
133
+ # Check for grayscale
134
+ tolerance = 10
135
+ ratio_of_gray_pixels = int(np.sum((tolerance < image) * (image < 255 - tolerance)) / np.size(image) * 100)
136
+ if ratio_of_gray_pixels > 1:
137
+ col3.warning(f":warning: Le nombre de pixels gris est élevé: {ratio_of_gray_pixels} % > 1%")
138
+
139
+ # Check reconstruction fidelity
140
+ distance = np.mean((np.array(image) - img_final) ** 2)
141
+ if distance > 10:
142
+ col3.warning(
143
+ f":warning: Le logo est peut-être trop dégradé (MSE={distance:.2f} > 10).\nVérifier visuellement.")
144
+
145
+ dim = (width, height)
146
+ # resize image
147
+ resized_img_final = cv2.resize(img_final, dim, interpolation=cv2.INTER_AREA)
148
+ resized_image_input = cv2.resize(image_input, dim, interpolation=cv2.INTER_AREA)
149
+
150
+ buf = BytesIO()
151
+ # img_stacked = np.hstack((resized_image_input, resized_img_final))
152
+ img_final = Image.fromarray(resized_img_final).convert("L")
153
+
154
+ img_final.save(buf, format="PNG")
155
+ byte_im = buf.getvalue()
156
+
157
+ btn = col3.download_button(
158
+ label=":inbox_tray: Télécharger l'image",
159
+ data=byte_im,
160
+ file_name=f"corrected_{uploaded_file.name}",
161
+ mime="image/png"
162
  )