public static Bitmap FoursConnection(this Bitmap map) { Bitmap dst = new Bitmap(map.Width, map.Height); var array = map.GetArrayOfPixels(); var imageObjects = new List <ImageObject>(); int currentColor = 2; for (int i = 0; i < map.Width; i++) { for (int j = 0; j < map.Height; j++) { dst.SetPixel(i, j, Color.White); if (array[i, j] == 1) { array = ConnectMap(array, i, j, currentColor, map.Width, imageObjects); currentColor++; } } } var imageEngineService = new ImageEngineService(); imageObjects.ForEach(imageEngineService.SetImageProperties); var kMeansProperies = new KMeansProperties(false, false, true, true); var clusters = imageEngineService.KMeans(imageObjects, 6, 0.0001, kMeansProperies); Random rnd = new Random(); foreach (var cluster in clusters) { var RRand = rnd.Next(0, 255); var GRand = rnd.Next(0, 255); var BRand = rnd.Next(0, 255); foreach (var clusterImage in cluster.Images) { clusterImage.Pixels.ForEach(x => setRColor(x, RRand, GRand, BRand, dst)); } } return(dst); }
public List <ImageCluster> KMeans(List <ImageObject> images, int countClusters, double stopValue, KMeansProperties properties) { var clusters = new List <ImageCluster>(countClusters); for (int i = 0; i < countClusters; i++) { clusters.Add(new ImageCluster()); } InitializeCluster(clusters, images); while (clusters.Any(x => x.IsNeedToRecalculate)) { CalculateClusters(clusters, images, properties); clusters.ForEach(x => x.ReCalculateCenterOfCluster(stopValue)); } return(clusters); }
private ImageCluster FindClusterWithMinDistance(ImageCluster firstCluster, ImageCluster secondCluster, ImageObject image, KMeansProperties properties) { var firstDistance = properties.EvalByProperites(firstCluster, image); var secondDistance = properties.EvalByProperites(secondCluster, image); return((firstDistance < secondDistance) ? firstCluster : secondCluster); }
private void CalculateClusters(List <ImageCluster> clusters, List <ImageObject> images, KMeansProperties properties) { clusters.ForEach(x => x.ClearImageItems()); images.ForEach(image => clusters.Aggregate((x, y) => FindClusterWithMinDistance(x, y, image, properties)).Images.Add(image)); }
public static Bitmap ConnectByKMeans(this Bitmap map, List <ImageObject> images, KMeansProperties kMeansProperties, int countOfCluster) { Bitmap dst = new Bitmap(map.Width, map.Height); for (int i = 0; i < map.Width; i++) { for (int j = 0; j < map.Height; j++) { dst.SetPixel(i, j, Color.White); } } var imageEngineService = new ImageEngineService(); images.ForEach(imageEngineService.SetImageProperties); var clusters = imageEngineService.KMeans(images, countOfCluster, 0.0001, kMeansProperties); Random rnd = new Random(); foreach (var cluster in clusters) { var RRand = rnd.Next(0, 255); var GRand = rnd.Next(0, 255); var BRand = rnd.Next(0, 255); foreach (var clusterImage in cluster.Images) { clusterImage.Pixels.ForEach(x => setRColor(x, RRand, GRand, BRand, dst)); } } return(dst); }