Vectorquantisatie is het proces waarbij een grote verzameling vectoren wordt opgedeeld in groepen (clusters), die elk worden vertegenwoordigd door één enkel centroid. In de context van kleur is elke pixel een 3D-vector (R, G, B), en vectorquantisatie reduceert miljoenen unieke kleuren tot een kleine, representatieve palet.
K-Means Clustering
Het meest gebruikte algoritme voor vectorquantisatie is K-means. Het werkt als volgt:
- K initiële centroids kiezen (bijv. willekeurig of via K-means++)
- Elke pixel toewijzen aan het dichtstbijzijnde centroid (met behulp van de Euclidische afstand)
- Elk centroid herberekenen als het gemiddelde van de eraan toegewezen pixels
- Stap 2–3 herhalen tot convergentie (de centroids bewegen niet meer)
Median Cut-alternatief
Median cut is een deterministisch alternatief dat de kleurruimte recursief splitst langs zijn langste as. Het levert exact 2ⁿ kleuren op en neigt ertoe meer paletentries toe te wijzen aan gebieden in het beeld met grotere kleurvariatie.
Onze aanpak: Exact + Gegroepeerd
In plaats van K-means te gebruiken, hanteert onze paletextractie een tweelaagse strategie. Voor geïndexeerde afbeeldingen (≤ 256 unieke kleuren) halen we het exacte palet eruit. Voor RGB-afbeeldingen met duizenden kleuren gebruiken we agglomeratieve groepering: pixels samenvoegen op basis van Euclidische afstand en de 64 meest dominante kleuren behouden. Dit voorkomt de afhankelijkheid van K-means van willekeurige initialisatie en levert consistente, deterministische resultaten op.
// Simplified grouping approach
function groupColors(
colors: Map<string, number>,
maxColors: number,
threshold: number,
): string[] {
// Sort by frequency (most common first)
// Merge colors within `threshold` Euclidean distance
// Return top `maxColors` representatives
}