mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-10-24 09:46:59 -06:00
The Automatic palette counts flat art's colours by area (a colour needs about 1% of the picture, 0.5% at Colors 100) and fits that count with median cut and area-weighted k-means. A stem, a highlight, or a near white beside a pale background (within 24 levels, so in one box) was averaged into a large neighbour; mixed-colour merging and Noise could then remove what was left. On the flat route only, after the count is fitted, rare_colours finds the colours too rare or too close for it and keeps those that are distinct (at least 2.5 in Oklab x 100 from every palette colour and from the main colour each stands for), flat (mostly one histogram bin) and drawn (a 4-connected region of their own unblended pixels of at least 8 pixels, or three of at least 4); a colour lying between two others, as anti-aliasing mixes them, must also have an inside. At most six, largest region first. They stay fixed while the other colours are refitted around them; merge_mixed leaves them alone; denoise_keeping keeps their regions of 4 pixels or more whatever Noise is (smaller specks still go). Full Tone, Limited and Automatic's continuous-tone route are unchanged, and denoise without kept labels is as before. Methods cited in the code: median cut (Heckbert 1982), k-means (Lloyd 1982), Oklab (Ottosson 2020), salient-colour preservation (Fukuda et al. 2019, doi:10.1117/12.2521607). The rule and its numbers are VectorCraft's own; Adobe does not document how its palettes are chosen. Tests (code-drawn): a rare stem or patch over 2-8 flat colours, hard and anti-aliased at 1x and 2x; near-white highlights on #FFF4E0 kept and still paths at Noise 16; a 3 px #909090 stem on #808080; scattered single pixels of the same areas add no colour; denoise_keeping at Noise 0-32. Measured on 66 synthetic flat logos (22 designs x hard 1x, anti-aliased 1x and 2x; local inputs): every key colour and no spurious one in 66 (was 39); missing key colours 0 (was 43), spurious 0 (was 2), merged pairs 0 (was 46); rendered dE00 0.348 -> 0.138. Four public-domain scan crops take the continuous-tone route and are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018tBcdwNhptqtmX32JCGFzB