예제 #1
0
        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];
            });
        }