Spaces:
Runtime error
Runtime error
Bugfix, back to old version
Browse files- Corriger.py +1 -0
- code/functions.py +38 -12
Corriger.py
CHANGED
|
@@ -164,6 +164,7 @@ elif authentication_status:
|
|
| 164 |
buf = BytesIO()
|
| 165 |
# img_stacked = np.hstack((resized_image_input, resized_img_final))
|
| 166 |
img_final = Image.fromarray(resized_img_final).convert("L")
|
|
|
|
| 167 |
img_final.save(buf, format="PNG")
|
| 168 |
byte_im = buf.getvalue()
|
| 169 |
|
|
|
|
| 164 |
buf = BytesIO()
|
| 165 |
# img_stacked = np.hstack((resized_image_input, resized_img_final))
|
| 166 |
img_final = Image.fromarray(resized_img_final).convert("L")
|
| 167 |
+
|
| 168 |
img_final.save(buf, format="PNG")
|
| 169 |
byte_im = buf.getvalue()
|
| 170 |
|
code/functions.py
CHANGED
|
@@ -2,15 +2,16 @@ import cv2
|
|
| 2 |
import numpy as np
|
| 3 |
import matplotlib.pyplot as plt
|
| 4 |
import os
|
|
|
|
| 5 |
import cairosvg
|
| 6 |
from potrace import POTRACE_CORNER, Path, Bitmap
|
| 7 |
import io
|
| 8 |
from PIL import Image, ImageStat
|
| 9 |
|
| 10 |
-
import streamlit
|
| 11 |
from PIL import Image
|
| 12 |
|
| 13 |
-
@
|
| 14 |
def pipeline_svg(image_input, size_value, level=3, streamlit=False, threshold=0, kernel_type=cv2.MORPH_ELLIPSE, dilate_lines_value=0):
|
| 15 |
"""
|
| 16 |
uint8 ==> uint8
|
|
@@ -40,17 +41,22 @@ def process_svg(img, size_value=12, level=1, streamlit=False, kernel_type=cv2.MO
|
|
| 40 |
kernel = get_kernel_ellipse(size, kernel_type=kernel_type)
|
| 41 |
img = cv2.erode(img, kernel, iterations=1)
|
| 42 |
|
| 43 |
-
|
| 44 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
|
| 46 |
img_array = binarise(img_array)
|
| 47 |
-
img_bin =
|
| 48 |
img_bin = img_bin.astype('uint8')
|
| 49 |
image_already_added = np.zeros_like(img_bin)
|
| 50 |
|
| 51 |
target_min_size = max(1, size_value)
|
| 52 |
|
| 53 |
-
image_final = img_bin
|
| 54 |
for i in range(target_min_size+1):
|
| 55 |
size = 2 * i + 1
|
| 56 |
kernel = get_kernel_ellipse(size, kernel_type=kernel_type)
|
|
@@ -65,14 +71,22 @@ def process_svg(img, size_value=12, level=1, streamlit=False, kernel_type=cv2.MO
|
|
| 65 |
kernel = get_kernel_ellipse(size, kernel_type=kernel_type)
|
| 66 |
dilate_image_petits_objets = cv2.dilate(image_petits_objets, kernel, iterations=1)
|
| 67 |
|
| 68 |
-
image_already_added =
|
| 69 |
|
| 70 |
if i > level:
|
| 71 |
-
image_final =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 72 |
|
| 73 |
-
#cv2.imwrite("image_finale.png", (255 - image_final))
|
| 74 |
-
image = convert_to_svg_and_back((255 - image_final))
|
| 75 |
return image
|
|
|
|
| 76 |
def get_kernel_ellipse(size, kernel_type=cv2.MORPH_ELLIPSE):
|
| 77 |
list_coords = [size, size]
|
| 78 |
return cv2.getStructuringElement(kernel_type, (list_coords[0], list_coords[1]),
|
|
@@ -101,7 +115,16 @@ def remove_solo_pixels(image, kernel_size=3):
|
|
| 101 |
dilation = dilation.astype('uint8')
|
| 102 |
return dilation
|
| 103 |
|
| 104 |
-
def convert_to_svg_and_back(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 105 |
image_pil = Image.fromarray(image_array)
|
| 106 |
|
| 107 |
bm = Bitmap(image_pil, blacklevel=0.5)
|
|
@@ -115,7 +138,9 @@ def convert_to_svg_and_back(image_array) -> np.array:
|
|
| 115 |
|
| 116 |
image = backend_svg_no_file(image_pil, plist)
|
| 117 |
|
| 118 |
-
|
|
|
|
|
|
|
| 119 |
|
| 120 |
def backend_svg_no_file(image, path: Path):
|
| 121 |
output = f'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="{image.width}" height="{image.height}" viewBox="0 0 {image.width} {image.height}">'
|
|
@@ -139,6 +164,7 @@ def backend_svg_no_file(image, path: Path):
|
|
| 139 |
output += f'<path stroke="none" fill="#000000" fill-rule="evenodd" d="{"".join(parts)}"/>'
|
| 140 |
|
| 141 |
output += "</svg>"
|
|
|
|
| 142 |
# From svg to png (bytes)
|
| 143 |
image_data = cairosvg.surface.PNGSurface.convert(output)
|
| 144 |
image = Image.open(io.BytesIO(image_data)).split()[-1]
|
|
|
|
| 2 |
import numpy as np
|
| 3 |
import matplotlib.pyplot as plt
|
| 4 |
import os
|
| 5 |
+
import copy
|
| 6 |
import cairosvg
|
| 7 |
from potrace import POTRACE_CORNER, Path, Bitmap
|
| 8 |
import io
|
| 9 |
from PIL import Image, ImageStat
|
| 10 |
|
| 11 |
+
import streamlit as st
|
| 12 |
from PIL import Image
|
| 13 |
|
| 14 |
+
@st.cache_data
|
| 15 |
def pipeline_svg(image_input, size_value, level=3, streamlit=False, threshold=0, kernel_type=cv2.MORPH_ELLIPSE, dilate_lines_value=0):
|
| 16 |
"""
|
| 17 |
uint8 ==> uint8
|
|
|
|
| 41 |
kernel = get_kernel_ellipse(size, kernel_type=kernel_type)
|
| 42 |
img = cv2.erode(img, kernel, iterations=1)
|
| 43 |
|
| 44 |
+
cv2.imwrite(image_path, img)
|
| 45 |
+
|
| 46 |
+
#st.image(img / 255.0, caption="Image après premiere svg and back", use_column_width='auto')
|
| 47 |
+
|
| 48 |
+
img_array = convert_to_svg_and_back(image_path)
|
| 49 |
+
|
| 50 |
+
#st.image(img_array / 255.0, caption="Image après premiere svg and back", use_column_width='auto')
|
| 51 |
|
| 52 |
img_array = binarise(img_array)
|
| 53 |
+
img_bin = 255 - img_array
|
| 54 |
img_bin = img_bin.astype('uint8')
|
| 55 |
image_already_added = np.zeros_like(img_bin)
|
| 56 |
|
| 57 |
target_min_size = max(1, size_value)
|
| 58 |
|
| 59 |
+
image_final = copy.deepcopy(img_bin)
|
| 60 |
for i in range(target_min_size+1):
|
| 61 |
size = 2 * i + 1
|
| 62 |
kernel = get_kernel_ellipse(size, kernel_type=kernel_type)
|
|
|
|
| 71 |
kernel = get_kernel_ellipse(size, kernel_type=kernel_type)
|
| 72 |
dilate_image_petits_objets = cv2.dilate(image_petits_objets, kernel, iterations=1)
|
| 73 |
|
| 74 |
+
image_already_added += image_petits_objets
|
| 75 |
|
| 76 |
if i > level:
|
| 77 |
+
image_final += dilate_image_petits_objets
|
| 78 |
+
|
| 79 |
+
cv2.imwrite("image_finale.png", (255 - image_final))
|
| 80 |
+
#st.image((255 - image_final) / 255.0, caption="(255 - image_final)", use_column_width='auto')
|
| 81 |
+
|
| 82 |
+
#image = convert_to_svg_and_back((255-image_final))
|
| 83 |
+
#image = 255 - image
|
| 84 |
+
#st.image((image) / 255.0, caption="convert_to_svg_and_back_new", use_column_width='auto')
|
| 85 |
+
|
| 86 |
+
image = convert_to_svg_and_back("image_finale.png")
|
| 87 |
|
|
|
|
|
|
|
| 88 |
return image
|
| 89 |
+
|
| 90 |
def get_kernel_ellipse(size, kernel_type=cv2.MORPH_ELLIPSE):
|
| 91 |
list_coords = [size, size]
|
| 92 |
return cv2.getStructuringElement(kernel_type, (list_coords[0], list_coords[1]),
|
|
|
|
| 115 |
dilation = dilation.astype('uint8')
|
| 116 |
return dilation
|
| 117 |
|
| 118 |
+
def convert_to_svg_and_back(image_path):
|
| 119 |
+
cmd_to_svg = f"potracer {image_path} -b svg -o images/image.svg"
|
| 120 |
+
cmd_to_raster = f"convert images/image.svg -colorspace Gray images/output.png"
|
| 121 |
+
|
| 122 |
+
assert (os.system(cmd_to_svg)) == 0, f"Error with {cmd_to_svg}"
|
| 123 |
+
assert (os.system(cmd_to_raster)) == 0, f"Error with {cmd_to_raster}"
|
| 124 |
+
|
| 125 |
+
return np.array(Image.open("images/output.png").convert('L'))
|
| 126 |
+
|
| 127 |
+
def convert_to_svg_and_back_new(image_array) -> np.array:
|
| 128 |
image_pil = Image.fromarray(image_array)
|
| 129 |
|
| 130 |
bm = Bitmap(image_pil, blacklevel=0.5)
|
|
|
|
| 138 |
|
| 139 |
image = backend_svg_no_file(image_pil, plist)
|
| 140 |
|
| 141 |
+
image = np.array(image)
|
| 142 |
+
|
| 143 |
+
return image
|
| 144 |
|
| 145 |
def backend_svg_no_file(image, path: Path):
|
| 146 |
output = f'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="{image.width}" height="{image.height}" viewBox="0 0 {image.width} {image.height}">'
|
|
|
|
| 164 |
output += f'<path stroke="none" fill="#000000" fill-rule="evenodd" d="{"".join(parts)}"/>'
|
| 165 |
|
| 166 |
output += "</svg>"
|
| 167 |
+
print(output)
|
| 168 |
# From svg to png (bytes)
|
| 169 |
image_data = cairosvg.surface.PNGSurface.convert(output)
|
| 170 |
image = Image.open(io.BytesIO(image_data)).split()[-1]
|