// 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; }
// =============== 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++; } } }