ColorSea seemed straightforward when I started: take a photo of someone's face, analyze their coloring, suggest a palette. How hard could it be? Turns out, pretty hard.
The first problem is lighting. The same person looks completely different under fluorescent office lights versus warm evening sun versus harsh flash. If your color analysis changes every time the user takes a photo in a different room, it's useless. I spent weeks building a lighting normalization step using white balance estimation.
I'm using MediaPipe for face detection and landmark recognition, and OpenCV for the image processing pipeline. The face landmarks let me sample colors from consistent facial regions — forehead, cheeks, lips — regardless of pose or angle. scikit-image handles the actual color extraction and clustering.
The 'seasonal color analysis' feature was the most requested thing. It classifies you into categories like 'warm autumn' or 'cool summer' based on your undertone, contrast level, and overall coloring. The challenge is that these categories were designed by human color analysts using subjective judgments. Translating that into code meant a lot of reading about color theory and then a lot of trial and error.
Skin tone analysis is culturally sensitive territory, and I was very conscious of that. I tested across a wide range of skin tones from the start, not as an afterthought. Some early versions of the algorithm worked great for lighter skin but fell apart for darker tones because the color space math doesn't treat the full spectrum evenly. I had to switch from RGB to LAB color space for most of the analysis.
The frontend is Next.js, the backend is FastAPI. Users upload a photo, the backend processes it and returns a palette with specific hex codes. I store results in PostgreSQL so people can go back and see their analysis history.
Biggest takeaway: color is way more subjective than I thought going in. Two people can look at the same swatch and disagree about whether it's 'warm' or 'cool.' The algorithm gives you a starting point, but it's not gospel.