public IImageRaster3D <float> Filter(IImageRaster3D <float> source_normal) { IImageRaster3D <float> source_inverted = new ImageRaster3D <float>(source_normal); return(null); }
public static ImageRaster3D <RangeType> Pad <RangeType>(IImageRaster3D <RangeType> image, RangeType padding_type, int padding_0_low, int padding_0_high, int padding_1_low, int padding_1_high, int padding_2_low, int padding_2_high) { ImageRaster3D <RangeType> padded = new ImageRaster3D <RangeType>(image.Raster.Size0 + padding_0_low + padding_0_high, image.Raster.Size1 + padding_1_low + padding_1_high, image.Raster.Size2 + padding_2_low + padding_2_high, padding_type); Parallel.For(0, padded.Raster.Size2 - (padding_2_low + padding_2_high), index_2 => { for (int index_1 = 0; index_1 < padded.Raster.Size1 - (padding_1_low + padding_1_high); index_1++) { for (int index_0 = 0; index_0 < padded.Raster.Size0 - (padding_0_low + padding_0_high); index_0++) { RangeType value = image.GetElementValue(index_0, index_1, index_2); padded.SetElementValue(index_0 + padding_0_low, index_1 + padding_1_low, index_2 + padding_2_low, value); } } }); return(padded); }
public ImageRaster3D(IImageRaster3D <RangeType> other, bool copy_values) : this(other.Raster, other.GetElementValues(copy_values), false) { }
public static ImageRaster3D <RangeType> Pad <RangeType>(IImageRaster3D <RangeType> image, RangeType padding_type, int padding_0, int padding_1, int padding_2) { return(Pad(image, padding_type, padding_0, padding_0, padding_1, padding_1, padding_2, padding_2)); }
public IImageRaster3D <bool> FindMedialAxes(IImageRaster3D <bool> image) { ImageRaster3D <bool> skeleton_image = ToolsImageRaster.Pad(image, false, 1, 1, 1); ITopologyElement topology = new TopologyElementRaster3D26Connectivity(skeleton_image.Raster); int[] euler_table = BuildEulerLookupTable(); bool changes = true; while (changes) { changes = false; List <int> candidates = ToolsImageRaster.GetShell3D6C(skeleton_image).GetElementIndexesWithValue(true); if (candidates.Count != 0) { // get 26 - neighbourhoods of candidates in volume List <int[]> neigbourhoods = new List <int[]>(); List <int> end_point_indexes = new List <int>(); for (int candidate_index = 0; candidate_index < candidates.Count; candidate_index++) { int[] element_neigbour_array = new int[26]; bool[] element_neigbour_true_array = new bool[26]; topology.ElementNeighboursRBA(candidates[candidate_index], element_neigbour_array); //int count = 0; for (int neigbour_index = 0; neigbour_index < topology.MaximumConnectivity; neigbour_index++) { //TODO something here } } // remove all endpoints (exactly one nb) from list neigbourhoods.RemoveAt(end_point_indexes); candidates.RemoveAt(end_point_indexes); // remove all non-Euler - invariant points from list List <int> euler_variate_indexes = new List <int>(); for (int candidate_index = 0; candidate_index < candidates.Count; candidate_index++) { if (compute_euler_characteristic(neigbourhoods[candidate_index], euler_table)) { euler_variate_indexes.Add(candidate_index); } } neigbourhoods.RemoveAt(euler_variate_indexes); candidates.RemoveAt(euler_variate_indexes); List <int> is_simple_indexes = new List <int>(); for (int candidate_index = 0; candidate_index < candidates.Count; candidate_index++) { if (is_simple(neigbourhoods[candidate_index])) { is_simple_indexes.Add(candidate_index); } } // remove all non-simple points from list candidates.RemoveAt(is_simple_indexes); //get subscript indices of remaining candidates //TODO [x, y, z] = ind2sub(padded_image_size, candidates); // if any candidates left: divide into 8 independent subvolumes TODO this is silly if (candidates.Count != 0) { // do re-checking for all points in each subvolume List <int> removal_indexes = new List <int>(); //sub2ind(padded_image_size, x(idx), y(idx), z(idx)); skeleton_image.SetElementValues(removal_indexes, false); // remove points List <int[]> nh = GetNeigbourhoods(skeleton_image, removal_indexes); List <int> di_rc = new List <int>(); for (int index = 0; index < nh.Count; index++) { if (!is_simple(nh[index])) { di_rc.Add(index); } } if (di_rc.Count != 0) { changes = true; //% at least one voxel removed skeleton_image.SetElementValues(di_rc, true); // TODO this seems weird } } } } return(skeleton_image); }