public IImageRaster3D <float> Filter(IImageRaster3D <float> source_normal)
        {
            IImageRaster3D <float> source_inverted = new ImageRaster3D <float>(source_normal);



            return(null);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 public ImageRaster3D(IImageRaster3D <RangeType> other, bool copy_values)
     : this(other.Raster, other.GetElementValues(copy_values), false)
 {
 }
Beispiel #4
0
 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));
 }
Beispiel #5
0
        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);
        }