Esempio n. 1
0
 // Farbdistanz zu anderem Cluster bestimmen
 public double colorDistance(Cluster c)
 {
     double distance = Math.Sqrt(Math.Pow(color.Blue - c.color.Blue, 2) + Math.Pow(color.Green - c.color.Green, 2) + Math.Pow(color.Red - c.color.Red, 2));
     return distance;
 }
Esempio n. 2
0
        // =============== Cluster-Center gleichmäßig positionieren ===============
        private void initializeClusterCenters()
        {
            // Clusters initializieren
            clusters = new Cluster[k];
            for (int i = 0; i < k; i++)
            {
                clusters[i] = new Cluster();
            }

            // Anzahl Clusters in x und y Richtung bestimmen
            numberYclusters = Convert.ToInt32(imageLab.Height / s);
            numberXclusters = Convert.ToInt32(imageLab.Width / s);
            while ((numberYclusters * numberXclusters) > k)
            {
                numberXclusters--;
            }

            // Nachbarcluster hinzufügen
            for (int i = 0; i < k; i++)
            {
                if (i >= numberXclusters)
                {
                    Cluster clusterAbove = clusters[i - numberXclusters];
                    clusters[i].neighbours.Add(clusterAbove, 0);
                }
                if (i < numberXclusters * (numberYclusters - 1))
                {
                    Cluster clusterBelow = clusters[i + numberXclusters];
                    clusters[i].neighbours.Add(clusterBelow, 0);
                }
                if ((i + 1) % numberXclusters != 0)
                {
                    Cluster clusterRight = clusters[i + 1];
                    clusters[i].neighbours.Add(clusterRight, 0);
                }
                if (i % numberXclusters != 0)
                {
                    Cluster clusterLeft = clusters[i - 1];
                    clusters[i].neighbours.Add(clusterLeft, 0);
                }
            }

            // Abstand der Cluster-Center zum Rand bestimmen
            int borderY = Convert.ToInt32((imageLab.Height - s * (numberYclusters - 1)) / 2);
            int borderX = Convert.ToInt32((imageLab.Width - s * (numberXclusters - 1)) / 2);

            // Cluster-Centerpositionen festlegen
            int index = 0;
            for (int r = 0; r < numberYclusters; r++)
            {
                for (int c = 0; c < numberXclusters; c++)
                {
                    int x = Convert.ToInt32(borderX + c * s);
                    int y = Convert.ToInt32(borderY + r * s);
                    clusters[index].currentCenter = new Vector5(pixels[x, y].vector.l, pixels[x, y].vector.a, pixels[x, y].vector.b, x, y);
                    index++;
                }
            }
        }