image-denoiser / scripts /generate_samples.py
Kajuto's picture
Initial commit - image denoiser + SR + MLOps stack
8b83582
"""
Generate synthetic test images in samples/ directory.
These are used by load_test.py to populate the Grafana dashboard.
Run: python scripts/generate_samples.py
"""
import os
import numpy as np
from PIL import Image, ImageDraw
SAMPLES_DIR = os.path.join(os.path.dirname(__file__), "..", "samples")
os.makedirs(SAMPLES_DIR, exist_ok=True)
def save(img: Image.Image, name: str):
path = os.path.join(SAMPLES_DIR, name)
img.save(path)
print(f" Saved {name}")
return path
def gradient(w=128, h=128):
arr = np.zeros((h, w, 3), dtype=np.uint8)
arr[:, :, 0] = np.linspace(30, 220, w) # R gradient horizontal
arr[:, :, 1] = np.linspace(50, 180, h)[:, None] # G gradient vertical
arr[:, :, 2] = 120
return Image.fromarray(arr)
def checkerboard(w=128, h=128, tile=16):
arr = np.zeros((h, w, 3), dtype=np.uint8)
for y in range(0, h, tile):
for x in range(0, w, tile):
color = 220 if (x // tile + y // tile) % 2 == 0 else 50
arr[y:y+tile, x:x+tile] = color
return Image.fromarray(arr)
def portrait(w=96, h=128):
img = Image.new("RGB", (w, h), (200, 180, 160))
draw = ImageDraw.Draw(img)
# sky
draw.rectangle([0, 0, w, h//3], fill=(100, 150, 220))
# ground
draw.rectangle([0, h*2//3, w, h], fill=(80, 130, 80))
# body
draw.rectangle([w//3, h//2, w*2//3, h*2//3], fill=(50, 80, 150))
# head
draw.ellipse([w//3, h//4, w*2//3, h//2], fill=(220, 180, 140))
return img
def cityscape(w=160, h=96):
img = Image.new("RGB", (w, h), (180, 200, 230))
draw = ImageDraw.Draw(img)
# sky gradient approximation
draw.rectangle([0, 0, w, h//2], fill=(100, 140, 200))
# buildings
buildings = [
(10, 60, 30, h, (80, 80, 100)),
(35, 40, 60, h, (100, 90, 110)),
(65, 50, 85, h, (70, 70, 90)),
(90, 30, 115, h, (90, 80, 100)),
(120, 55, 145, h, (85, 85, 95)),
]
for x0, y0, x1, y1, c in buildings:
draw.rectangle([x0, y0, x1, y1], fill=c)
# windows
for wx in range(x0+4, x1-4, 8):
for wy in range(y0+6, y1-4, 10):
draw.rectangle([wx, wy, wx+4, wy+5], fill=(220, 220, 150))
return img
def nature(w=128, h=128):
img = Image.new("RGB", (w, h), (100, 160, 220))
draw = ImageDraw.Draw(img)
# sky
draw.rectangle([0, 0, w, h//2], fill=(100, 160, 220))
# hills
draw.ellipse([-20, h//2-20, w//2+20, h+10], fill=(60, 120, 60))
draw.ellipse([w//3, h//2-10, w+20, h+10], fill=(80, 140, 80))
# sun
draw.ellipse([w-30, 10, w-10, 30], fill=(255, 220, 50))
return img
if __name__ == "__main__":
print("Generating sample images...")
save(gradient(), "gradient.png")
save(checkerboard(), "checkerboard.png")
save(portrait(), "portrait.png")
save(cityscape(), "cityscape.png")
save(nature(), "nature.png")
print(f"\nDone — {len(os.listdir(SAMPLES_DIR))} images in samples/")