phomo
github.com
What it is
phomo is a free tool that creates photographic mosaics by arranging tile images to recreate a master image. It compares color distributions between tiles and regions of the master, then assigns tiles using a linear sum assignment algorithm. The project can be installed with pip as a Python package or run through its `phomo` command, which accepts a master image and a directory of tile images. Command-line options include cropping and resizing the master and tiles, black-and-white conversion, grid display, and control over how often tiles appear. Matching choices include greyscale, norm, and luv_approx distance metrics, color equalization, and color-distribution matching. A greedy assignment mode is described as improving performance while reducing accuracy. CUDA acceleration is available through an extra, requiring a CUDA-compatible GPU and toolkit. The package requires Python >=3.9 and <3.13, runs on Linux, macOS, and Windows, and lists PNG as its output format. It is published under the MIT License.
Spec sheet
- What it does
- phomo creates photographic mosaics by arranging tile images to recreate a master image.Read 15 Oct 2026 · github.com
- Purpose
- phomo creates photographic mosaics by arranging tile images to recreate a master image.Read 3 Oct 2026 · github.com
- Platforms
- PyPI lists macOS, Windows, and Linux operating system classifiers for the package.Read 3 Oct 2026 · pypi.org
- License
- The package is released under the MIT License, permitting reuse, modification, distribution, sublicensing, and sale subject to the notice and warranty terms.Read 15 Oct 2026 · raw.githubusercontent.com
- Assignment algorithm
- The default builder solves the tile-placement assignment problem with SciPy's linear-sum-assignment implementation.Read 15 Oct 2026 · loiccoyle.com
- Changelog: dependency security
- The 1.1.2 changelog entry dated January 18, 2025 says dependencies were updated to close Dependabot security alerts.Read 15 Oct 2026 · github.com
- Changelog: greedy flag
- The 1.2.0 changelog entry dated January 21, 2025 records exposing greedy assignment through the CLI and documenting its flag.Read 15 Oct 2026 · github.com
- CLI image controls
- CLI flags cover cropping, resizing, black-and-white conversion, tile reuse count, grid display, and verbosity.Read 15 Oct 2026 · github.com
- CLI inputs
- The command accepts a master image path and a directory of tile images and writes a mosaic output file.Read 15 Oct 2026 · github.com
- CLI isolation
- The documentation recommends pipx when the user only needs the command-line tool.Read 15 Oct 2026 · docs.loiccoyle.com
- Color matching flags
- CLI options can equalize colors or match the master palette to tiles and tiles to the master.Read 15 Oct 2026 · github.com
- Color-distribution matching
- Its distance calculation compares color distributions within tiles and master regions rather than only average colors.Read 15 Oct 2026 · loiccoyle.com
- Command line
- The package provides a `phomo` command that accepts a master image and a directory of tile images.Read 3 Oct 2026 · github.com
- CUDA API limit
- The CUDA distance-matrix method supports only norm and greyscale metrics and requires Numba with CUDA installed.Read 15 Oct 2026 · docs.loiccoyle.com
- Distance metrics
- The CLI exposes greyscale, norm, and luv_approx metrics.Read 15 Oct 2026 · github.com
- Distance-matrix API
- Mosaic.d_matrix accepts a worker count, a named metric, or a custom callable and returns a NumPy array.Read 15 Oct 2026 · docs.loiccoyle.com
- Documentation depth
- The documentation includes installation, CLI help, examples, class references, and performance guidance.Read 15 Oct 2026 · docs.loiccoyle.com
- GPU acceleration
- An optional CUDA path uses Numba kernels to accelerate distance-matrix computation.Read 15 Oct 2026 · loiccoyle.com
- GPU support
- GPU acceleration is available through the CUDA extra and requires a CUDA-compatible GPU and CUDA toolkit.Read 3 Oct 2026 · github.com
- Greedy mode
- A greedy assignment option is documented as faster while sacrificing matching accuracy.Read 15 Oct 2026 · github.com
- Grid visualization
- The package can display a master-image tile grid and subdivide high-contrast regions.Read 15 Oct 2026 · loiccoyle.com
- Image controls
- CLI options include cropping and resizing the master and tile images, black-and-white conversion, grid display, and tile appearance count.Read 3 Oct 2026 · github.com
- Installation
- PyPI documents installation with pip and offers a separate phomo[cuda] extra.Read 15 Oct 2026 · pypi.org
- Latest release
- PyPI lists version 1.2.0 as released on January 21, 2025.Read 15 Oct 2026 · pypi.org
- Maintainer
- PyPI identifies Loic Coyle as the author and lists loiccoyle as the sole maintainer.Read 15 Oct 2026 · pypi.org
- Maker profile
- Loïc Coyle's GitHub profile lists London as location and Polaron as affiliation.Read 15 Oct 2026 · github.com
- Matching options
- The CLI offers greyscale, norm, and luv_approx distance metrics, color equalization, and options to match color distributions.Read 3 Oct 2026 · github.com
- Package artifacts
- Version 1.2.0 is distributed as a 17.5 kB source archive and a 19.9 kB universal Python wheel.Read 15 Oct 2026 · pypi.org
- Palette tools
- Palette normalization and Reinhard color-transfer modes can alter either the tiles or the master image to align color distributions.Read 15 Oct 2026 · loiccoyle.com
- Parallel processing
- Distance-matrix work can be split among multiple worker processes.Read 15 Oct 2026 · loiccoyle.com
- Performance option
- A greedy tile assignment option is described as improving performance at the expense of accuracy.Read 3 Oct 2026 · github.com
- Python API
- The documented Python API centers on Master, Pool, and Mosaic classes.Read 15 Oct 2026 · docs.loiccoyle.com
- Python package
- The project can be installed with pip and used as a Python package.Read 3 Oct 2026 · github.com
- Python versions
- PyPI states that the package requires Python >=3.9 and <3.13.Read 3 Oct 2026 · pypi.org
- Release history
- The PyPI history begins with version 0.1.0 dated September 10, 2021.Read 15 Oct 2026 · pypi.org
- Runtime dependencies
- The project declares Pillow, NumPy, tqdm, Matplotlib, SciPy, and OpenCV dependencies, with Numba optional for CUDA.Read 15 Oct 2026 · github.com
- Rust port
- The related phomo-rs project provides a Rust library, command-line binary, WebAssembly bindings, and browser web app.Read 15 Oct 2026 · loiccoyle.com
- Supported operating systems
- PyPI classifiers list MacOS, Microsoft Windows, and POSIX Linux.Read 15 Oct 2026 · pypi.org
- System requirement
- The package requires Python 3.9 or newer but below Python 3.13.Read 15 Oct 2026 · pypi.org
- Tile matching
- It compares tile images with master image regions using color distribution differences, then assigns tiles to regions with a linear sum assignment algorithm.Read 3 Oct 2026 · github.com
- Tile-size requirement
- Mosaic construction expects the Pool tiles to have matching dimensions.Read 15 Oct 2026 · docs.loiccoyle.com
- WebAssembly package
- The web-app article shows phomo-wasm being installed with npm add phomo-wasm and used from JavaScript bindings.Read 15 Oct 2026 · loiccoyle.com
Plans and prices
Strong points and limits
Strong points
- Free Python package and command-line utility.
- Offers multiple tile-matching metrics and color controls.
- Supports Linux, macOS, and Windows.
- Published under the MIT License.
Limits
- Requires Python >=3.9 and <3.13.
- CUDA acceleration requires a compatible GPU and toolkit.
- Greedy assignment trades accuracy for performance.
Who it suits
phomo suits people comfortable using a Python package or command-line tool to build image mosaics from their own tile library. It offers controls for image preparation and tile matching across Linux, macOS, and Windows.
Verdict
phomo exposes mosaic creation through a Python package and CLI, with several image and matching controls. CUDA acceleration has additional hardware and toolkit requirements, while greedy assignment sacrifices accuracy for performance.
Where Specifiction places it
- Photo Mosaic Software#2 of 248.8