Spaces:
Running on Zero
Running on Zero
| from __future__ import annotations | |
| from pathlib import Path | |
| import cv2 | |
| import numpy as np | |
| from PIL import Image, ImageOps | |
| def load_rgb(path: str | Path) -> Image.Image: | |
| return ImageOps.exif_transpose(Image.open(path)).convert("RGB") | |
| def save_rgb(image: Image.Image, path: str | Path) -> None: | |
| path = Path(path) | |
| path.parent.mkdir(parents=True, exist_ok=True) | |
| image.save(path) | |
| def pil_to_bgr(image: Image.Image) -> np.ndarray: | |
| return cv2.cvtColor(np.asarray(image.convert("RGB")), cv2.COLOR_RGB2BGR) | |
| def bgr_to_pil(image: np.ndarray) -> Image.Image: | |
| return Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) | |
| def order_points(points: np.ndarray) -> np.ndarray: | |
| pts = np.asarray(points, dtype=np.float32) | |
| rect = np.zeros((4, 2), dtype=np.float32) | |
| s = pts.sum(axis=1) | |
| rect[0] = pts[np.argmin(s)] | |
| rect[2] = pts[np.argmax(s)] | |
| diff = np.diff(pts, axis=1) | |
| rect[1] = pts[np.argmin(diff)] | |
| rect[3] = pts[np.argmax(diff)] | |
| return rect | |
| def round_to_multiple(value: int, multiple: int = 16) -> int: | |
| return max(multiple, (int(value) // multiple) * multiple) | |