Files
labs-information-security/lab6-steganography/entities/psnr_metric.py
T

23 lines
796 B
Python
Raw Normal View History

2026-07-12 14:06:45 +04:00
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)