예제 #1
0
        public Color3[] Clusters(int count)
        {
            Color3[] l = new Color3[count];
            int      p = 0;

            for (int i = 0; i < this.cubes.Count; i++)
            {
                ColorCube cube = this.cubes[i];
                long      a    = 0;
                long      b    = 0;
                long      c    = 0;
                int       cnt  = cube.Pixels.Count;
                for (int j = 0; j < cnt; j++)
                {
                    PixelInfo px = cube.Pixels[j];
                    a += (long)px.A;
                    b += (long)px.B;
                    c += (long)px.C;
                }
                l[p++] = new Color3(
                    MedianCutClustering.UnHash((int)(a / (long)cnt), min.L, max.L),
                    MedianCutClustering.UnHash((int)(b / (long)cnt), min.A, max.A),
                    MedianCutClustering.UnHash((int)(c / (long)cnt), min.B, max.B));
                if (p >= count)
                {
                    break;
                }
            }
            while (p < count)
            {
                l[p++] = new Color3(0f, 0f, 0f);
            }
            return(l);
        }
예제 #2
0
        public void SetPoints(Color3[] list)
        {
            ColorCube cube = new ColorCube(list.Length);

            for (int i = 0; i < list.Length; i++)
            {
                PixelInfo px = new PixelInfo();
                px.A     = px.B = px.C = 0;
                px.Index = i;
                cube.Pixels.Add(px);
            }

            this.max = new LabColor();
            this.min = new LabColor();

            for (int i = 0; i < cube.Pixels.Count; i++)
            {
                Color3   c   = list[cube.Pixels[i].Index];
                LabColor lab = new LabColor(c.A, c.B, c.C);
                if (i == 0)
                {
                    min.L = max.L = lab.L;
                    min.A = max.A = lab.A;
                    min.B = max.B = lab.B;
                    continue;
                }
                min.L = MedianCutClustering.Min(lab.L, min.L);
                min.A = MedianCutClustering.Min(lab.A, min.A);
                min.B = MedianCutClustering.Min(lab.B, min.B);
                max.L = MedianCutClustering.Max(lab.L, max.L);
                max.A = MedianCutClustering.Max(lab.A, max.A);
                max.B = MedianCutClustering.Max(lab.B, max.B);
            }

            for (int i = 0; i < cube.Pixels.Count; i++)
            {
                PixelInfo px  = cube.Pixels[i];
                Color3    c   = list[cube.Pixels[i].Index];
                LabColor  lab = new LabColor(c.A, c.B, c.C);
                px.A = MedianCutClustering.Hash(lab.L, min.L, max.L);
                px.B = MedianCutClustering.Hash(lab.A, min.A, max.A);
                px.C = MedianCutClustering.Hash(lab.B, min.B, max.B);
            }

            this.cubes = new List <ColorCube>();
            this.cubes.Add(cube);
        }