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
|
"""Image util functions for loading and saving images."""
from pathlib import Path
from typing import Union
from urllib.request import urlopen
import cv2
import numpy as np
from PIL import Image
def read_image_pil(image_uri: Union[Path, str], grayscale: bool = False) -> Image:
"""Return PIL image."""
image = Image.open(image_uri)
if grayscale:
image = image.convert("L")
return image
def read_image(image_uri: Union[Path, str], grayscale: bool = False) -> np.array:
"""Read image_uri."""
if isinstance(image_uri, str):
image_uri = Path(image_uri)
def read_image_from_filename(image_filename: Path, imread_flag: int) -> np.array:
return cv2.imread(str(image_filename), imread_flag)
def read_image_from_url(image_url: Path, imread_flag: int) -> np.array:
url_response = urlopen(str(image_url)) # nosec
image_array = np.array(bytearray(url_response.read()), dtype=np.uint8)
return cv2.imdecode(image_array, imread_flag)
imread_flag = cv2.IMREAD_GRAYSCALE if grayscale else cv2.IMREAD_COLOR
image = None
if image_uri.exists():
image = read_image_from_filename(image_uri, imread_flag)
else:
image = read_image_from_url(image_uri, imread_flag)
if image is None:
raise ValueError(f"Could not load image at {image_uri}")
return image
def write_image(image: np.ndarray, filename: Union[Path, str]) -> None:
"""Write image to file."""
cv2.imwrite(str(filename), image)
|