Initial commit
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
|
||||
__all__ = ["TestImageGenerator"]
|
||||
|
||||
from .chessboard_generator import ChessboardGenerator
|
||||
from .gradient_generator import GradientGenerator
|
||||
@@ -0,0 +1,33 @@
|
||||
|
||||
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)
|
||||
@@ -0,0 +1,26 @@
|
||||
|
||||
from __future__ import annotations
|
||||
import numpy as np
|
||||
|
||||
|
||||
class GradientGenerator:
|
||||
"""Градиентное изображение произвольного размера и каналов."""
|
||||
|
||||
@staticmethod
|
||||
def make(size: int = 512, channels: int = 3) -> np.ndarray:
|
||||
"""Создать квадратный градиент size×size для 1 или 3 каналов."""
|
||||
if not isinstance(size, int) or size <= 0:
|
||||
raise ValueError("size должен быть положительным целым.")
|
||||
if channels not in (1, 3):
|
||||
raise ValueError("channels должен быть 1 или 3.")
|
||||
|
||||
x = np.linspace(0.0, 255.0, num=size, dtype=np.float64)
|
||||
h = np.tile(x, (size, 1)) # горизонтальный градиент
|
||||
v = np.tile(x[:, None], (1, size)) # вертикальный градиент
|
||||
d = (0.5 * (h + v)) # диагональный градиент
|
||||
|
||||
if channels == 1:
|
||||
return d.astype(np.uint8)
|
||||
|
||||
rgb = np.stack([h, v, d], axis=2).astype(np.uint8) # R=горизонталь, G=вертикаль, B=диагональ
|
||||
return rgb
|
||||
Reference in New Issue
Block a user