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)); }
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); } }); }
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(); } }