Ejemplo n.º 1
0
        public override Tuple <IImageRaster <IRaster2DInteger, int>, IImageRaster <IRaster2DInteger, float>, IList <int[]>, IList <float[]> > Initialize(IRaster2DInteger raster)
        {
            IImageRaster2D <int>   region_image               = new ImageRaster2D <int>(raster);
            IImageRaster2D <float> distance_image             = new ImageRaster2D <float>(raster, Single.MaxValue);
            Tuple <IList <int[]>, IList <float[]> > Centroids = InitializeCentroids(raster);
            IList <int[]>   cluster_spatial_centroids         = Centroids.Item1;
            IList <float[]> cluster_feature_centroids         = Centroids.Item2;

            int[] neigbourhood_dimensions    = d_cluster_dimensions_double;
            int   neigbourhood_element_count = ((neigbourhood_dimensions[0] * 2) + 1) * ((neigbourhood_dimensions[1] * 2) + 1);

            int[] element_index_indexes = new int[neigbourhood_element_count];

            for (int centroid_index = 0; centroid_index < cluster_spatial_centroids.Count; centroid_index++)
            {
                raster.GetNeigbourhoodElementIndexesRBA(cluster_spatial_centroids[centroid_index], neigbourhood_dimensions, element_index_indexes);
                for (int element_index_index = 0; element_index_index < neigbourhood_element_count; element_index_index++)
                {
                    int element_index = element_index_indexes[element_index_index];
                    if (element_index != -1)
                    {
                        int[] element_coordinates = raster.GetElementCoordinates(element_index);
                        float distance            = FunctionDistanceEuclidean.ComputeStatic(element_coordinates, cluster_spatial_centroids[centroid_index]);
                        if (distance < distance_image.GetElementValue(element_index))
                        {
                            distance_image.SetElementValue(element_index, distance);
                            region_image.SetElementValue(element_index, centroid_index);
                        }
                    }
                }
            }
            return(new Tuple <IImageRaster <IRaster2DInteger, int>, IImageRaster <IRaster2DInteger, float>, IList <int[]>, IList <float[]> >(region_image, distance_image, cluster_spatial_centroids, cluster_feature_centroids));
        }
Ejemplo n.º 2
0
        public static void DistanceTransform2DSlowRBA(ImageRaster2D <bool> mask_image, float[] voxel_size, ImageRaster2D <float> distance_image)
        {
            IRaster2DInteger raster = mask_image.Raster;
            int size_0 = mask_image.Raster.Size0;
            int size_1 = mask_image.Raster.Size1;

            // Apply the transform in the x-direction
            //for (int plane_index = 0; plane_index < size_z * size_y; plane_index++)
            //{
            Parallel.For(0, size_0, index_0 =>
            {
                for (int index_1 = 0; index_1 < size_1; index_1++)
                {
                    float best_distance = float.MaxValue;
                    if (mask_image.GetElementValue(index_0, index_1))
                    {
                        best_distance = 0;
                    }
                    else
                    {
                        for (int index_0_1 = 0; index_0_1 < size_0; index_0_1++)
                        {
                            for (int index_1_1 = 0; index_1_1 < size_1; index_1_1++)
                            {
                                if (mask_image.GetElementValue(index_0_1, index_1_1))
                                {
                                    float distance = ToolsMath.Sqrt(ToolsMath.Sqr((index_0_1 - index_0) * voxel_size[0]) + ToolsMath.Sqr((index_1_1 - index_1) * voxel_size[0]));
                                    if (distance < best_distance)
                                    {
                                        best_distance = distance;
                                    }
                                }
                            }
                        }
                    }
                    distance_image.SetElementValue(index_0, index_1, best_distance);
                }
            });
        }
Ejemplo n.º 3
0
        private void Start()
        {
            Complex[] block;
            while (is_running)
            {
                if (blocker.OutputQueue.TryDequeue(out block))
                {
                    // do fft
                    MathNet.Numerics.IntegralTransforms.Fourier.Forward(block);
                    //TODO Shift image?

                    float sum = 0;
                    for (int y_index = 0; y_index < image.Raster.Size1; y_index++)
                    {
                        //image.SetElementValue(x_index, y_index, (float)random.NextDouble());
                        float value = 0;
                        for (int f_index = 0; f_index < f_rate; f_index++)
                        {
                            if ((y_index * f_rate) + f_index < (block.Length))
                            {
                                value += (float)(block[(y_index * f_rate) + f_index].Magnitude * ((float)((y_index * f_rate) + f_index)));
                            }
                        }
                        value /= f_rate;
                        sum   += value;
                        image.SetElementValue(x_index, y_index, value);
                    }

                    sum /= image.Raster.Size1 * 0.5f;

                    for (int y_index = 0; y_index < image.Raster.Size1; y_index++)
                    {
                        image.SetElementValue(x_index, y_index, image.GetElementValue(x_index, y_index) / sum);
                    }
                    x_index = (x_index + 1) % image.Raster.Size0;
                }
                //Render image
                Render();
            }
        }