Spaces:
Runtime error
Runtime error
| import os | |
| import datetime | |
| import cv2 | |
| import numpy as np | |
| from PIL import Image, ImageDraw | |
| def save_images(img_list, folder): | |
| if not os.path.exists(folder): | |
| os.makedirs(folder) | |
| now = datetime.datetime.now() | |
| date_str = now.strftime("%Y-%m-%d") | |
| folder_path = os.path.join(folder, date_str) | |
| if not os.path.exists(folder_path): | |
| os.makedirs(folder_path) | |
| time_str = now.strftime("%H_%M_%S") | |
| for idx, img in enumerate(img_list): | |
| image_number = idx + 1 | |
| filename = f"{time_str}_{image_number}.jpg" | |
| save_path = os.path.join(folder_path, filename) | |
| cv2.imwrite(save_path, img[..., ::-1]) | |
| def check_channels(image): | |
| channels = image.shape[2] if len(image.shape) == 3 else 1 | |
| if channels == 1: | |
| image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR) | |
| elif channels > 3: | |
| image = image[:, :, :3] | |
| return image | |
| def resize_image(img, max_length=768): | |
| height, width = img.shape[:2] | |
| max_dimension = max(height, width) | |
| if max_dimension > max_length: | |
| scale_factor = max_length / max_dimension | |
| new_width = int(round(width * scale_factor)) | |
| new_height = int(round(height * scale_factor)) | |
| new_size = (new_width, new_height) | |
| img = cv2.resize(img, new_size) | |
| height, width = img.shape[:2] | |
| img = cv2.resize(img, (width - (width % 64), height - (height % 64))) | |
| return img | |
| def insert_spaces(string, nSpace): | |
| if nSpace == 0: | |
| return string | |
| new_string = "" | |
| for char in string: | |
| new_string += char + " " * nSpace | |
| return new_string[:-nSpace] | |
| def draw_glyph(font, text): | |
| g_size = 50 | |
| W, H = (512, 80) | |
| new_font = font.font_variant(size=g_size) | |
| img = Image.new(mode="1", size=(W, H), color=0) | |
| draw = ImageDraw.Draw(img) | |
| left, top, right, bottom = new_font.getbbox(text) | |
| text_width = max(right - left, 5) | |
| text_height = max(bottom - top, 5) | |
| ratio = min(W * 0.9 / text_width, H * 0.9 / text_height) | |
| new_font = font.font_variant(size=int(g_size * ratio)) | |
| text_width, text_height = new_font.getsize(text) | |
| offset_x, offset_y = new_font.getoffset(text) | |
| x = (img.width - text_width) // 2 | |
| y = (img.height - text_height) // 2 - offset_y // 2 | |
| draw.text((x, y), text, font=new_font, fill="white") | |
| img = np.expand_dims(np.array(img), axis=2).astype(np.float64) | |
| return img | |
| def draw_glyph2( | |
| font, text, polygon, vertAng=10, scale=1, width=512, height=512, add_space=True | |
| ): | |
| enlarge_polygon = polygon * scale | |
| rect = cv2.minAreaRect(enlarge_polygon) | |
| box = cv2.boxPoints(rect) | |
| box = np.int0(box) | |
| w, h = rect[1] | |
| angle = rect[2] | |
| if angle < -45: | |
| angle += 90 | |
| angle = -angle | |
| if w < h: | |
| angle += 90 | |
| vert = False | |
| if abs(angle) % 90 < vertAng or abs(90 - abs(angle) % 90) % 90 < vertAng: | |
| _w = max(box[:, 0]) - min(box[:, 0]) | |
| _h = max(box[:, 1]) - min(box[:, 1]) | |
| if _h >= _w: | |
| vert = True | |
| angle = 0 | |
| img = np.zeros((height * scale, width * scale, 3), np.uint8) | |
| img = Image.fromarray(img) | |
| # infer font size | |
| image4ratio = Image.new("RGB", img.size, "white") | |
| draw = ImageDraw.Draw(image4ratio) | |
| _, _, _tw, _th = draw.textbbox(xy=(0, 0), text=text, font=font) | |
| text_w = min(w, h) * (_tw / _th) | |
| if text_w <= max(w, h): | |
| # add space | |
| if len(text) > 1 and not vert and add_space: | |
| for i in range(1, 100): | |
| text_space = insert_spaces(text, i) | |
| _, _, _tw2, _th2 = draw.textbbox(xy=(0, 0), text=text_space, font=font) | |
| if min(w, h) * (_tw2 / _th2) > max(w, h): | |
| break | |
| text = insert_spaces(text, i - 1) | |
| font_size = min(w, h) * 0.80 | |
| else: | |
| shrink = 0.75 if vert else 0.85 | |
| font_size = min(w, h) / (text_w / max(w, h)) * shrink | |
| new_font = font.font_variant(size=int(font_size)) | |
| left, top, right, bottom = new_font.getbbox(text) | |
| text_width = right - left | |
| text_height = bottom - top | |
| layer = Image.new("RGBA", img.size, (0, 0, 0, 0)) | |
| draw = ImageDraw.Draw(layer) | |
| if not vert: | |
| draw.text( | |
| (rect[0][0] - text_width // 2, rect[0][1] - text_height // 2 - top), | |
| text, | |
| font=new_font, | |
| fill=(255, 255, 255, 255), | |
| ) | |
| else: | |
| x_s = min(box[:, 0]) + _w // 2 - text_height // 2 | |
| y_s = min(box[:, 1]) | |
| for c in text: | |
| draw.text((x_s, y_s), c, font=new_font, fill=(255, 255, 255, 255)) | |
| _, _t, _, _b = new_font.getbbox(c) | |
| y_s += _b | |
| rotated_layer = layer.rotate(angle, expand=1, center=(rect[0][0], rect[0][1])) | |
| x_offset = int((img.width - rotated_layer.width) / 2) | |
| y_offset = int((img.height - rotated_layer.height) / 2) | |
| img.paste(rotated_layer, (x_offset, y_offset), rotated_layer) | |
| img = np.expand_dims(np.array(img.convert("1")), axis=2).astype(np.float64) | |
| return img | |