示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
 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));
 }
示例#5
0
        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);
        }