from __future__ import annotations from dataclasses import dataclass import numpy as np @dataclass(frozen=True) class PsnrMetric: """Расчёт PSNR для двух массивов одинаковой формы.""" max_value: float = 255.0 def psnr(self, a: np.ndarray, b: np.ndarray) -> float: """Вычислить PSNR.""" if a.shape != b.shape: raise ValueError("Массивы должны иметь одинаковую форму.") x = a.astype(np.float64) y = b.astype(np.float64) # MSE по всем элементам (каналы включены) mse = np.mean((x - y) ** 2) if mse == 0.0: return float("inf") return 20.0 * np.log10(self.max_value) - 10.0 * np.log10(mse)