예제 #1
0
        /// <summary> 3D connected components detector
        /// Computes various information on the detected objects
        /// </summary>
        /// <param name="labeledInputimage">Gray level input image (background value must be 0)</param>
        /// <param name="labeledOutputImage">Empty input image of same size that labeledInput image (can be null)</param>
        /// <param name="image">Original greyscale image (can be null)</param>
        /// <param name="band">the image band</param>
        /// <param name="connectivity">Connectivity. MUST be 6 or 26</param>
        /// <param name="minVolume">Minimum object volume to consider</param>
        /// <param name="maxVolume">Maximum object volume to consider</param>
        public ConnectedComponentSet(cImage labeledInputimage, cImage labeledOutputImage, cImage image, int band, eConnectivity connectivity, float minVolume, float maxVolume)
        {
            if (image != null && (image.Width != labeledInputimage.Width || image.Height != labeledInputimage.Height || image.Depth != labeledInputimage.Depth))
            {
                if (connectivity == eConnectivity.THREED_6 || connectivity == eConnectivity.THREED_26)
                {
                    //  throw new DescriptorException("Uncompatible Image sizes");
                }
            }

            if (labeledOutputImage != null && (labeledOutputImage.Width != labeledInputimage.Width || labeledOutputImage.Height != labeledInputimage.Height || labeledOutputImage.Depth != labeledInputimage.Depth))
            {
                if (connectivity == eConnectivity.THREED_6 || connectivity == eConnectivity.THREED_26)
                {
                    // throw new DescriptorException("Uncompatible Image sizes");
                }
                if (labeledOutputImage.GetNumChannels() != 1)
                {
                    //  throw new DescriptorException("Output label image must be single band");
                }
            }

            if (labeledInputimage.Depth == 1)
            {
                if (connectivity == eConnectivity.THREED_6 || connectivity == eConnectivity.THREED_26)
                {
                    //  throw new DescriptorException("Given connectivity is incompatible with the image depth");
                }
            }
            else if (connectivity == eConnectivity.TWOD_4 || connectivity == eConnectivity.TWOD_8 || connectivity == eConnectivity.TWOD_24)
            {
                //  throw new DescriptorException("Given connectivity is incompatible with the image depth");
            }

            this.min = minVolume;
            this.max = maxVolume;
            this.connectivity = connectivity;
            this.width = labeledInputimage.Width;
            this.height = labeledInputimage.Height;
            this.depth = labeledInputimage.Depth;
            this.scanSliceSize = width * height;
            this.twoTimesWidth = 2 * width;

            if (labeledOutputImage == null)
            {
                this.labeledOutputImage = new cImage(labeledInputimage.Width, labeledInputimage.Height, labeledInputimage.Depth, 1);
            }
            else
            {
                this.labeledOutputImage = labeledOutputImage;
            }
            this.labeledOutput = this.labeledOutputImage.SingleChannelImage[0].Data;
            this.labeledInputimage = labeledInputimage;
            this.labeledInput = labeledInputimage.SingleChannelImage[band].Data;
            this.image = image;

            FindConnectedComponents();
        }
예제 #2
0
 protected VoxelList(int label, cImage labeledImage, cImage image, eConnectivity connectivity)
 {
     this.label = label;
     surfacePoints = new List<int[]>();
     points = new List<int[]>();
     indices = new List<int>();
     values = new List<float[]>();
     this.labeledImage = labeledImage;
     this.labeledImageData = labeledImage.SingleChannelImage[0].Data;
     this.image = image;
     if (image != null)
     {
         int NumChannels = image.GetNumChannels();
         this.numBands = NumChannels;
         this.intensity = new float[NumChannels];
         this.surfaceIntensity = new float[NumChannels];
         this.maxIntensity = new float[NumChannels];
         this.minIntensity = new float[NumChannels];
         for (int b = 0; b < NumChannels; b++)
         {
             maxIntensity[b] = float.MinValue;
             minIntensity[b] = float.MaxValue;
         }
     }
     this.imageWidth = labeledImage.Width;
     this.imageHeight = labeledImage.Height;
     this.imageDepth = labeledImage.Depth;
     this.scanSliceSize = labeledImage.SliceSize;
     this.connectivity = connectivity;
 }
예제 #3
0
 internal ConnectedVoxels(int label, cImage labeledImage, cImage image, eConnectivity connectivity)
     : base(label, labeledImage, image, connectivity)
 {
 }
예제 #4
0
 /// <summary> 3D connected components detector
 /// Computes various information on the detected objects
 /// </summary>
 /// <param name="labeledInputimage">Gray level input image (background value must be 0)</param>
 /// <param name="band">the image band</param>
 /// <param name="connectivity">Connectivity. MUST be 6 or 26</param>
 /// <param name="minVolume">Minimum object volume to consider</param>
 /// <param name="maxVolume">Maximum object volume to consider</param>
 public ConnectedComponentSet(cImage labeledInputimage, int band, eConnectivity connectivity, float minVolume, float maxVolume)
     : this(labeledInputimage, null, null, band, connectivity, minVolume, maxVolume)
 {
 }
예제 #5
0
        /// <summary>
        /// Grab a set of already computed ConnectedComponent into a ConnectedComponentSet
        /// </summary>
        /// <param name="list">The list of ConnectedComponent</param>
        public ConnectedComponentSet(List<ConnectedVoxels> list)
        {
            /// TO DO: CHECK THE CONSISTENCY OF THE LABELOUTPUT IMAGE AND THE IMAGE WITH THE ACUAL
            /// VALUES OF THE CONNECTED COMPONENTS

            if (list.Count == 0)
                return;

            this.image = list[0].Image;
            this.labeledOutputImage = list[0].LabelImage;
            this.connectivity = list[0].Connectivity;
            this.width = labeledOutputImage.Width;
            this.height = labeledOutputImage.Height;
            this.scanSliceSize = labeledOutputImage.SliceSize;
            this.twoTimesWidth = 2 * this.width;

            int i = 0;
            cc = new ConnectedVoxels[list.Count];
            foreach (ConnectedVoxels cci in list)
            {
                if (cci.LabelImage != labeledOutputImage)
                    throw new ArgumentException("Connected components were not defined from the same image");
                if (cci.Connectivity != connectivity)
                    throw new ArgumentException("Connected components were not defined with the same connectivity");
                cc[i++] = cci;
            }
        }
예제 #6
0
 public Component(int label, cImage labeledImage, cImage image, eConnectivity connectivity)
     : base(label, labeledImage, image, connectivity)
 {
 }