File size: 1,955 Bytes
8096125
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Resolution, color-space, statistics, and histogram helpers."""

from __future__ import annotations

import matplotlib.pyplot as plt
import numpy as np
import cv2

from filters.builtin import ensure_rgb


def low_resolution_pair(image: np.ndarray, percent: int = 25) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
    img = ensure_rgb(image)
    h, w = img.shape[:2]
    small = cv2.resize(img, (max(1, w * percent // 100), max(1, h * percent // 100)), interpolation=cv2.INTER_AREA)
    low_rgb = cv2.resize(small, (w, h), interpolation=cv2.INTER_NEAREST)
    high_gray = cv2.cvtColor(cv2.cvtColor(img, cv2.COLOR_RGB2GRAY), cv2.COLOR_GRAY2RGB)
    low_gray = cv2.cvtColor(cv2.cvtColor(low_rgb, cv2.COLOR_RGB2GRAY), cv2.COLOR_GRAY2RGB)
    return img, low_rgb, high_gray, low_gray


def pixel_preview(image: np.ndarray, x: int = 0, y: int = 0, size: int = 6) -> list[list[str]]:
    img = ensure_rgb(image)
    y0, x0 = max(0, y), max(0, x)
    crop = img[y0 : y0 + size, x0 : x0 + size]
    return [[str(tuple(int(v) for v in px)) for px in row] for row in crop]


def stats(image: np.ndarray) -> dict[str, float | int | list[int]]:
    img = ensure_rgb(image)
    return {"shape": list(img.shape), "mean": float(img.mean()), "std": float(img.std()), "min": int(img.min()), "max": int(img.max())}


def histogram_figure(high_rgb: np.ndarray, low_rgb: np.ndarray):
    fig, axes = plt.subplots(1, 2, figsize=(10, 4), tight_layout=True)
    for ax, img, title in [(axes[0], high_rgb, "High resolution"), (axes[1], low_rgb, "Low resolution")]:
        for idx, color in enumerate(["red", "green", "blue"]):
            ax.hist(img[..., idx].ravel(), bins=64, range=(0, 255), color=color, alpha=0.35)
        gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
        ax.hist(gray.ravel(), bins=64, range=(0, 255), color="black", alpha=0.35)
        ax.set_title(title)
        ax.set_xlabel("Intensity")
        ax.set_ylabel("Pixels")
    return fig