138 lines
4.4 KiB
Markdown
138 lines
4.4 KiB
Markdown
|
|
# Ember Colorizer
|
|||
|
|
|
|||
|
|
[English](README.md) · [Español](README.es.md)
|
|||
|
|
|
|||
|
|
Apply Ember color palettes to images with high precision.
|
|||
|
|
|
|||
|
|
## Installation
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
uv sync
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### GPU acceleration (optional)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Apple Silicon (MPS) or NVIDIA (CUDA)
|
|||
|
|
pip install 'ember-colorized[gpu]'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Usage
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Auto-generated output: filename-{palette}-colorized.ext
|
|||
|
|
ember-colorizer --colors=ember-light /path/to/image.png
|
|||
|
|
|
|||
|
|
# Custom output path
|
|||
|
|
ember-colorizer --colors=ember -o /path/to/output.png /path/to/image.jpg
|
|||
|
|
|
|||
|
|
# Fast mode (direct RGB mapping, no K-means)
|
|||
|
|
ember-colorizer --colors=ember-soft -m fast /path/to/image.png
|
|||
|
|
|
|||
|
|
# Adjust recolor strength (0.0 = original, 1.0 = full)
|
|||
|
|
ember-colorizer --colors=ember-light -s 0.7 /path/to/image.png
|
|||
|
|
|
|||
|
|
# More clusters for better accuracy (aggressive mode)
|
|||
|
|
ember-colorizer --colors=ember -k 20 /path/to/image.png
|
|||
|
|
|
|||
|
|
# Use GPU acceleration (aggressive mode only)
|
|||
|
|
ember-colorizer --colors=ember --use-gpu /path/to/image.png
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Palettes
|
|||
|
|
|
|||
|
|
| Palette | Background | Type |
|
|||
|
|
|---------|-----------|------|
|
|||
|
|
| `ember` | `#1c1b19` | dark |
|
|||
|
|
| `ember-soft` | `#242320` | dark |
|
|||
|
|
| `ember-light` | `#e6dac4` | light |
|
|||
|
|
| `ember-lighter` | `#e8e4de` | light |
|
|||
|
|
|
|||
|
|
## Modes
|
|||
|
|
|
|||
|
|
### Aggressive mode (`-m aggressive`)
|
|||
|
|
|
|||
|
|
Uses **K-means clustering** to analyze the image before recoloring.
|
|||
|
|
|
|||
|
|
**What is K-means?** It's an algorithm that groups similar colors together. Imagine throwing 12 darts at a color wheel — each dart moves to the "center of gravity" of the colors closest to it. After several rounds, the darts settle on the most representative colors in the image.
|
|||
|
|
|
|||
|
|
**How it works:**
|
|||
|
|
1. K-means finds the 12 dominant colors in your image (configurable with `-k`)
|
|||
|
|
2. Each dominant color is mapped to its nearest Ember palette color (RGB Euclidean distance)
|
|||
|
|
3. Every pixel is reassigned to its cluster's mapped palette color
|
|||
|
|
4. Strength controls the blend between original and recolored
|
|||
|
|
|
|||
|
|
**Result:** Colors group naturally — sky areas stay coherent, skin tones stay unified. Best for photos and complex images.
|
|||
|
|
|
|||
|
|
### Fast mode (`-m fast`)
|
|||
|
|
|
|||
|
|
**Direct pixel-by-pixel RGB nearest-color mapping** — no clustering, no filters. Each pixel independently maps to the closest Ember palette color using Euclidean distance in RGB space.
|
|||
|
|
|
|||
|
|
**How it works:**
|
|||
|
|
1. For each pixel, compute Euclidean distance to all palette colors in RGB space
|
|||
|
|
2. Replace the pixel with the nearest palette color
|
|||
|
|
|
|||
|
|
**Result:** Maximum detail preservation — edges, gradients, fine lines (anime hair, outlines) stay sharp. Best for anime, illustrations, line art, or when speed matters.
|
|||
|
|
|
|||
|
|
### GPU acceleration (`--use-gpu`)
|
|||
|
|
|
|||
|
|
When `--use-gpu` is passed, K-means clustering runs on the GPU with smart downsampling — clusters on a 200K-pixel subset, then assigns all pixels vectorized. This greatly accelerates the recoloring time for complex, high-resolution images.
|
|||
|
|
|
|||
|
|
**Supported backends** (auto-detected):
|
|||
|
|
| Backend | Hardware | Package |
|
|||
|
|
|---------|----------|---------|
|
|||
|
|
| cuML | NVIDIA GPU | `cuml-cu12` |
|
|||
|
|
| PyTorch MPS | Apple Silicon | `torch` |
|
|||
|
|
| PyTorch CUDA | NVIDIA GPU | `torch` |
|
|||
|
|
| sklearn | CPU fallback | (always available) |
|
|||
|
|
|
|||
|
|
**Performance** (5304×7952 image, 12 clusters):
|
|||
|
|
| Backend | Time |
|
|||
|
|
|---------|------|
|
|||
|
|
| CPU (sklearn) | ~127s |
|
|||
|
|
| GPU (Apple MPS) | ~8s |
|
|||
|
|
|
|||
|
|
**Output example:**
|
|||
|
|
```
|
|||
|
|
Input: photo.png
|
|||
|
|
Palette: ember (Ember)
|
|||
|
|
Mode: aggressive
|
|||
|
|
Strength: 1.0
|
|||
|
|
GPU: yes (Apple (arm64))
|
|||
|
|
Output: photo-ember-colorized.png
|
|||
|
|
⠹ Clustering colors...
|
|||
|
|
Success! in 7.818s
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Key differences
|
|||
|
|
|
|||
|
|
| | Aggressive | Fast |
|
|||
|
|
|---|---|---|
|
|||
|
|
| Algorithm | K-means → cluster mapping | Direct RGB nearest-color |
|
|||
|
|
| Speed | Slower (clustering pass) | Fastest (vectorized) |
|
|||
|
|
| Accuracy | Higher (cluster coherence) | Good (per-pixel) |
|
|||
|
|
| Best for | Photos, complex scenes | Anime, illustrations, line art |
|
|||
|
|
| Control | `-k` clusters, `-s` strength | `-s` strength only |
|
|||
|
|
| GPU | `--use-gpu` supported | CPU only |
|
|||
|
|
|
|||
|
|
## Showcase
|
|||
|
|
|
|||
|
|
- High-resolution image recoloring using GPU --use-gpu
|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|
- Same image recoloring using CPU only
|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|
- Simple image recoloring using fast mode
|
|||
|
|
|
|||
|
|

|
|||
|
|
|
|||
|
|
As you can see, when processing a high-resolution image, GPU mode significantly accelerates the process.
|
|||
|
|
|
|||
|
|
This feature has been tested on Apple Silicon GPUs; it should also work on NVIDIA. If you encounter any issues with your GPU, feel free to open an [issue](https://openlat.dev/JesusChapman/ember-colorized/issues/new).
|
|||
|
|
|
|||
|
|
## License
|
|||
|
|
|
|||
|
|
LGPL-3.0
|