Mhhh, ce n'est pas évident, ce que tu demandes ...
En effet, il faut faire le bon compromis entre représenter les nuances de la couleur prédominante, et ne pas oublier les couleurs peu représentées mais chromatiquement éloignées de la dominante.
Tout d'abord, il faut que tu fasses une table donnant, pour chacune des Y couleurs de départ, le nombre de pixels de cette couleur, afin d'éliminer toutes les couleurs à 0, et avoir une idée de la dominante.
Ensuite, pour réduire le nombre de couleur en perdant le minimum de qualité, je te conseille de passer du codage RGB au codage YUV (luminance-chrominance).
Luminance :
Y = 1 x (0.299 R + 0.587 G + 0.114 B)
Chrominance (codée sur deux vecteurs) :
U = 0.492 x (B - Y)
V = 0.877 x (R - Y)
Pour U et V, il faut faire attention au fait que l'on peut avoir une valeur négative, il faut donc les coder sur des variables plus grandes (words au lieu de bytes, ou dwords au lieu de words).
Ensuite, pour chacune des Y couleurs, il faut que tu donnes une note en fonction du nombre de pixels de cette couleur et d'autres critères, comme la distance du plus proche voisin ( D
YUV 1-22 = (Y
1-Y
2)
2 + (U
1-U
2)
2 + (V
1-V
2)
2 ), ainsi que des choses plus subtiles et tordues

.
Enfin, tu sélectionnes les X couleurs ayant les plus hautes notes (ou plus basses, ça dépend comment tu attribues les notes), et pour les Y-X couleurs restantes, tu les remplaces par leur plus proche voisin (toujours en codage YUV).
Voilà, j'espère t'avoir donné quelques pistes et idées ...
@++