The Problem
Converting a photo into a LEGO mosaic sounds simple: resize the image, find the closest LEGO color for each pixel, done.
Except it looks terrible. Skin tones turn green. Hair becomes a muddy blob. The algorithm picks colors that are mathematically close in RGB but perceptually wrong.
The Solution: OKLab Color Space
I switched from RGB to OKLab, a perceptually uniform color space designed in 2020. In OKLab, equal numerical distances correspond to equal perceived color differences.
This alone was a massive improvement, but it wasn't enough.
Material-Aware Matching
LEGO bricks aren't paint. A matte red brick and a transparent red brick look completely different under the same light. My engine models each brick's material properties (matte, transparent, metallic, glitter) and weights the color distance accordingly.
// Simplified: material-aware distance
function colorDistance(pixel, brick) {
const labDist = oklabDistance(pixel, brick.co
Discussion
Leave the first comment
Be the first to leave a mark on this discussion.