Mój pomysł na szybko:
1. Tworzysz paletę N kolorów i tą samą ilość liczników (na razie wyzerowanych). Wszystkie kolory ustawiasz na średnią koloru wszystkich pixeli na obrazie.
2. Dla każdego pixela na obrazie (nazwijmy go x):
2.1 Sprawdzasz który z kolorów z palety jest mu najbliższy (nazwijmy go a).
2.2 Ustawiasz ten kolor w palecie na średnią ważoną tego koloru w palecie i sprawdzanego koloru na obrazie, gdzie wagą pierwszego jest jego licznik (nazwijmy go _a), a wagą drugiego jeden. Czyli a = (_a*a+x) / (_a+1). Zwiększasz licznik o 1 (czyli wywołujesz _a++).
W wyobraźni działa. Zakłada że masz metody pozwalające wirtualnie sumować kolory lub w inny sposób policzyć średnią ważoną (po prostu traktuj składowe jako liczby bez górnego ograniczenia). No i że, tak jak napisałem w poprzednim poście, jesteś w stanie zmierzyć "odległość" między dwoma kolorami. Najprostsza propozycja: r : różnica, j : jasność, n: nasycenie, b : barwa, a : kolor pierwszy, z : kolor drugi : r = j(a) - j(z) + n(a) - n(z) + b(a) - b(z) - zakładając że funkcje j, n i b przyjmują ten sam zakres wartości (np 0-100).
Oczywiście zamiast na literkach robisz to na tablicach i dopisujesz odpowiednie metody.