from __future__ import annotations import numpy as np class ChessboardGenerator: """Шахматная доска произвольного размера и каналов.""" @staticmethod def make(size: int = 512, channels: int = 3, tile: int = 32) -> np.ndarray: """Создать шахматку size×size; для RGB каждый квадрат случайного цвета.""" if size <= 0: raise ValueError("size должен быть > 0.") if channels not in (1, 3): raise ValueError("channels должен быть 1 или 3.") if tile <= 0 or size % tile != 0: raise ValueError("tile должен быть > 0 и делить size без остатка.") n = size // tile # число клеток по стороне if channels == 1: base = (np.add.outer(np.arange(n), np.arange(n)) % 2).astype(np.uint8) * 255 return np.kron(base, np.ones((tile, tile), dtype=np.uint8)) # RGB: случайный цвет на каждую клетку (uint8) rng = np.random.default_rng() colors = rng.integers(0, 256, size=(n, n, 3), dtype=np.uint8) # Апсемплинг каждой компоненты по плитке r = np.kron(colors[:, :, 0], np.ones((tile, tile), dtype=np.uint8)) g = np.kron(colors[:, :, 1], np.ones((tile, tile), dtype=np.uint8)) b = np.kron(colors[:, :, 2], np.ones((tile, tile), dtype=np.uint8)) return np.stack([r, g, b], axis=-1)