No description
  • Python 75.1%
  • TypeScript 7.8%
  • JavaScript 7.5%
  • HTML 6.4%
  • CSS 2.9%
  • Other 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-04-22 07:03:54 +01:00
docs Add background stripping and cleaned badge fixture 2026-04-22 06:55:59 +01:00
examples/corpus Add corpus benchmarks and lattice refinement 2026-04-21 21:56:25 +01:00
src/repixelizer Add edge concentration and stroke wobble metrics 2026-04-22 07:03:54 +01:00
tests Add edge concentration and stroke wobble metrics 2026-04-22 07:03:54 +01:00
.gitignore Add corpus benchmarks and lattice refinement 2026-04-21 21:56:25 +01:00
pyproject.toml Bootstrap the repixelizer CLI project 2026-04-21 16:10:55 +01:00
README.md Improve lattice inference with source evidence 2026-04-22 00:00:05 +01:00

Repixelizer

Repixelizer is a standalone Python CLI for images that are doing a pixel art impression instead of actually respecting the grid.

It is aimed at the annoying middle ground: sprites, emblems, and logos that look locally pixelated but fall apart the second you ask them to commit to one lattice like grown-ups.

Instead of pretending this is a resize problem, Repixelizer treats it as lattice inference plus local structure preservation: infer the implied grid, choose real output cells, and snap them back onto a coherent pixel lattice while preserving the source's local adjacency patterns.

Examples

Repixelizer was built to rescue fake pixel art, but it can also be used to generate pixel art directly from non-pixel source art when the shapes are clean and the local structure is doing something useful.

Top row: glossy non-pixel badge art repixelized at 128x128. Bottom row: an AI fake-pixel interpretation of the same badge cleaned up with automatic lattice inference, which landed on 122x122 for this image.

Repixelizer example comparison

That is the two-headed pitch in one image: force non-pixel art onto a coherent grid, or take AI pixel art that only respects the grid locally and make it commit.

Current Status

This is already a serious experimental baseline, not a toy prototype:

  • CUDA-backed inference and solver paths are wired up
  • round-trip corpus benchmarking is built in
  • soft and crisp corruption profiles are supported
  • diagnostics and baseline comparisons are written automatically
  • a black-box tuning harness exists for longer offline parameter sweeps

The current pipeline is especially strong on benchmarked sprite and emblem inputs where local fake-pixel texture is meaningful but the global grid is inconsistent.

Quickstart

python -m venv .venv
.venv\Scripts\python -m pip install -e .[dev]

Run the optimizer:

repixelize input.png --out output.png
repixelize input.png --out output.png --diagnostics-dir diagnostics --device auto

Run the optimizer plus baselines:

repixelize compare input.png --out output.png --diagnostics-dir diagnostics

Corpus And Benchmarks

Prepare a local Creative Commons corpus:

repixelize prepare-corpus --corpus-dir examples/corpus

Run the round-trip benchmark:

repixelize benchmark --corpus-dir examples/corpus --out-dir artifacts/benchmark

Useful benchmark flags:

  • --profile soft or --profile crisp
  • --case <name> repeated for a focused slice
  • --limit <n> for the first n matching cases
  • --infer-size to test automatic size inference
  • --keep-existing if you explicitly want to preserve an old output directory

By default the benchmark clears its output directory before each run so the artifacts folder stays readable.

Tuning

Repixelizer includes a black-box tuning loop for longer offline searches over solver weights:

repixelize tune --corpus-dir examples/corpus --out-dir artifacts/tuning --profile soft --limit 8

This is intentionally a search-based tuner, not gradient descent. The objective depends on discrete argmins, thresholding, and benchmark comparisons, so it is better treated as a repeatable black-box optimization problem.

Repository Hygiene

This repo is set up to be safe for local experimentation:

  • generated outputs under artifacts/ are ignored
  • local corpus payloads under examples/corpus/originals/ are ignored
  • archived raw sprite sheets under examples/corpus/source-sheets/ are ignored
  • generated corpus metadata files are ignored

That keeps benchmark assets, attribution exports, and tuning runs from polluting upstream history while still keeping the code, docs, and corpus layout tracked.

Repo Layout

  • src/repixelizer: core package
  • tests: focused regression tests
  • docs/spec.md: product and technical spec
  • docs/implementation-plan.md: working roadmap
  • examples/corpus/README.md: local corpus layout and attribution workflow

Core modules:

  • inference.py: target size and phase inference
  • continuous.py: source-aware lattice snapping and local discrete refinement
  • metrics.py: fidelity, adjacency, and motif metrics
  • benchmark.py: corpus benchmark runner
  • tuning.py: black-box hyperparameter search harness
  • synthetic.py: facsimile generation for tests and benchmarks

Validation

Run the focused test suite with:

.venv\Scripts\python -m pytest -q

Notes

  • The local corpus is optional; the codebase is still usable without it.
  • The benchmark and tuning commands are designed for iterative local work, not for shipping generated artifacts in git.
  • Palette enforcement is optional and can be left off for unconstrained recovery runs.