Initial commit

This commit is contained in:
user
2026-07-12 14:06:45 +04:00
commit a75028d68f
148 changed files with 3275 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
from __future__ import annotations
from dataclasses import dataclass
import numpy as np
@dataclass(frozen=True)
class LsbRow8:
"""Встраивание/извлечение 8 бит в первый ряд блока 8×8 через LSB."""
@staticmethod
def embed(block: np.ndarray, bits: np.ndarray) -> np.ndarray:
"""Вернуть копию блока с вшитыми 8 битами."""
if block.shape != (8, 8):
raise ValueError("Нужен блок 8x8.")
b = np.asarray(block, dtype=np.uint8).copy()
v = np.asarray(bits, dtype=np.uint8).reshape(-1)
if v.size != 8 or not np.isin(v, [0, 1]).all():
raise ValueError("Нужно 8 бит 0/1.")
# Меняем только младшие биты первых 8 пикселей верхней строки
row = b[0, :8]
row = (row & 0xFE) | v
b[0, :8] = row
return b
@staticmethod
def extract(block: np.ndarray) -> np.ndarray:
"""Извлечь 8 бит из LSB первого ряда блока."""
if block.shape != (8, 8):
raise ValueError("Нужен блок 8x8.")
b = np.asarray(block, dtype=np.uint8)
return (b[0, :8] & 1).astype(np.uint8)