private static void BuildPalette(IDictionary <RGBColor, RGBColor> palette) { var colors = new double[palette.Keys.Count][]; Parallel.ForEach(palette.Keys.Select((color, index) => (color, index)), tuple => { colors[tuple.index] = tuple.color.CopyTo(new double[3]); }); var kmeans = new KMeans(MaxColor); var clusters = kmeans.Learn(colors); var reduce = clusters.Centroids.Select(RGBColor.CopyFrom).ToArray(); Parallel.ForEach(colors, color => { var normal = RGBColor.CopyFrom(color); var idx = clusters.Decide(color); palette[normal] = reduce[idx]; }); }