23 lines
796 B
Python
23 lines
796 B
Python
|
|
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)
|