Esempio n. 1
0
        internal override double GeAssessment(AssesmentsSegment[] segments, IColorSheme colorSheme)
        {
            double bdc = GetBDC(segments, colorSheme);
            double wcd = GetWDC(segments, colorSheme);

            return(1 - 1d / Math.Exp(Math.Exp(bdc - wcd)));
        }
Esempio n. 2
0
        private double GetWDC(AssesmentsSegment[] segments, IColorSheme colorSheme)
        {
            double wcd = 0;

            for (int i = 0; i < segments.Length; i++)
            {
                for (int j = 0; j < segments[i].Length; j++)
                {
                    wcd += colorSheme.AssessmentsDifference(segments[i].points[j], segments[i].center) / segments[i].Length;
                }
            }

            return(wcd / segments.Length);
        }
        internal override double GeAssessment(AssesmentsSegment[] segments, IColorSheme colorSheme)
        {
            int    k         = segments.Length;
            int    n         = segments[0].center.Length;
            Matrix sumMatrix = new Matrix(n);

            for (int i = 0; i < k; i++)
            {
                AssesmentsSegment current = segments[i];
                sumMatrix += current.Length * GetMatrixOfCovariations(current, colorSheme);
            }

            return(sumMatrix.Determinant());
        }
        internal override double GeAssessment(AssesmentsSegment[] segments, IColorSheme colorSheme)
        {
            double distance = 0;
            int    k        = segments.Length;

            for (int j = 0; j < k; j++)
            {
                for (int l = 0; l < segments[j].Length; l++)
                {
                    distance += Math.Pow(colorSheme.AssessmentsDifference(segments[j].points[l], segments[j].center), 2);
                }
            }
            //distance += colorSheme.AssessmentsDifference(segments[j].points[l], segments[j].center);

            return(distance);
        }
        internal override double GeAssessment(AssesmentsSegment[] segments, IColorSheme colorSheme)
        {
            double distance = 0;
            int    k        = segments.Length;

            for (int j = 0; j < k; j++)
            {
                for (int l = 0; l < segments[j].Length - 1; l++)
                {
                    for (int h = l + 1; h < segments[j].Length; h++)
                    {
                        distance += colorSheme.AssessmentsDifference(segments[j].points[l], segments[j].points[h]);
                    }
                }
            }

            return(distance);
        }
Esempio n. 6
0
        internal override double GeAssessment(AssesmentsSegment[] segments, IColorSheme colorSheme)
        {
            int k = segments.Length;

            SumOfPairwiseInternalDistancesAssessment tempassessment = new SumOfPairwiseInternalDistancesAssessment();

            double a = tempassessment.GeAssessment(segments, colorSheme);

            double denominatorToACoef = 0;
            double denominatorToBCoef = 1;

            for (int i = 0; i < k; i++)
            {
                var Nj = segments[i].Length;
                denominatorToACoef += (Nj * (Nj - 1) / 2d);

                denominatorToBCoef *= Nj;
            }

            a /= 1d / denominatorToACoef;

            double b = 0;

            for (int j = 0; j < k - 1; j++)
            {
                for (int l = 0; l < segments[j].Length; l++)
                {
                    for (int m = j + 1; m < k; m++)
                    {
                        for (int h = 0; h < segments[m].Length; h++)
                        {
                            b += colorSheme.Difference(segments[j].points[l], segments[m].points[h]);
                        }
                    }
                }
            }

            b /= 1d / denominatorToBCoef;

            return(a / b);
        }
        private Matrix GetMatrixOfCovariations(AssesmentsSegment segment, IColorSheme colorSheme)
        {
            Func <double, double, int, double> d = null;

            if (colorSheme is GrayScaleColorSheme || colorSheme is RGBColorSheme)
            {
                d = (p1, p2, dim) => (p1 - p2) / 255d;
            }
            else if (colorSheme is LabColorSheme)
            {
                d = (p1, p2, dim) => dim == 0 ? (p1 - p2) / 100d : (p2 - p2) / 128d;
            }

            int n = segment.center.Length;

            double[] averages = segment.center;

            double[][] cov = ArrayMatrix.GetJaggedArray(n, n);

            for (int k = 0; k < n; k++)
            {
                for (int p = 0; p < n; p++)
                {
                    double v = 0;
                    for (int l = 0; l < segment.Length; l++)
                    {
                        //v += ((segment.points[l][k] - averages[k])) * ((segment.points[l][p] - averages[p]));
                        v += d(segment.points[l][k], averages[k], k) * d(segment.points[l][p], averages[p], p);
                    }


                    cov[k][p] = v / segment.Length;
                }
            }

            return(new Matrix(cov));
        }
        private void button4_Click(object sender, EventArgs e)
        {
            textBox1.Text = String.Empty;

            double sigma = Convert.ToDouble(sigmaTextBox.Text.Replace(".", ","));
            int    k     = Convert.ToInt32(KtextBox.Text);
            int    min   = Convert.ToInt32(MinTextBox.Text);

            IColorSheme colorSheme = null;

            if (GreyScaleRadioButton.Checked)
            {
                colorSheme = new GrayScaleColorSheme();
            }
            if (RgbRadioButton.Checked)
            {
                colorSheme = new RGBColorSheme();
            }
            if (LabRadioButton.Checked)
            {
                colorSheme = new LabColorSheme();
            }

            Segmentation segmentObj = new Segmentation();

            segmented = segmentObj.DoSegmentation(m_workImage, sigma, k, min, colorSheme);
            OutputBitmapOnPictureBox(segmented);
            outoutSegmented = true;

            //вывод в текстбокс
            textBox1.Text += $"Сегментів: {segmentObj.m_componentLength}" + Environment.NewLine + Environment.NewLine;

            if (AssessmentCheckBox.Checked)
            {
                textBox1.Text += segmentObj.CalcAssessments();
            }
        }
Esempio n. 9
0
        private double GetBDC(AssesmentsSegment[] segments, IColorSheme colorSheme)
        {
            int N = segments.Sum(s => s.points.Count);

            Vector v = new Vector(new double[3]);

            for (int i = 0; i < segments.Length; i++)
            {
                v += new Vector(segments[i].center);
            }

            v /= segments.Length;

            double[] centerOfCenters = v.GetCloneOfData();

            double bcd = 0;

            for (int i = 0; i < segments.Length; i++)
            {
                bcd += colorSheme.AssessmentsDifference(segments[i].center, centerOfCenters) * segments[i].Length;
            }

            return(bcd / (N * segments.Length));
        }
        public Bitmap DoSegmentation(double[,,] arrayImage, double sigma, double k, int minSize, IColorSheme colorSheme)
        {
            m_height = arrayImage.GetLength(1);
            m_width  = arrayImage.GetLength(2);

            //debug
            System.Diagnostics.Debug.WriteLine("Reading done: " + DateTime.Now);

            m_colorSheme = colorSheme;

            //препроцессинг иображения
            arrayImage = colorSheme.Convert(arrayImage);

            //сохранение для проведения оценки качества сегментации
            m_arrayImageCopy = (double[, , ])arrayImage.Clone();

            //debug
            System.Diagnostics.Debug.WriteLine("color sheme changed: " + DateTime.Now);
            //DebugImageInfo(arrayImage);

            //smoothing
            GaussianBlur gaussianBlur = new GaussianBlur();

            double[][] filter = gaussianBlur.getKernel(sigma);
            double[,,] blurredImage = DoubleArrayImageOperations.ConvolutionFilter(arrayImage, filter);

            //debug
            System.Diagnostics.Debug.WriteLine("Smooting done: " + DateTime.Now);
            //тест размещения преобразования цвета
            //arrayImage = colorSheme.Convert(arrayImage);

            //построение графа
            Edge[] edges = buildGraphByImage(blurredImage)
                           .OrderBy(el => el.w)
                           .ToArray();

            //debug
            System.Diagnostics.Debug.WriteLine("graph builded: " + DateTime.Now);

            //debugging

            System.Diagnostics.Debug.WriteLine("edges total: " + edges.Length);

            //double minWeight = edges.Min(el => el.w);
            //double maxWeight = edges.Max(el => el.w);
            //Edge[] EdgesMoreThanMin = edges.Where(el => el.w > minWeight + 0.1).ToArray();
            //Edge[] EdgesZeroWidth = edges.Where(el => el.w < 0.01).ToArray();
            //
            //Edge[] edgesHor = edges.Where(el => el.neightbourType == NeightbourType.Horizontal).ToArray();
            //Edge[] edgesVer = edges.Where(el => el.neightbourType == NeightbourType.Vertical).ToArray();
            //Edge[] edgesTopDiag = edges.Where(el => el.neightbourType == NeightbourType.TopDiagonal).ToArray();
            //Edge[] edgesBottom = edges.Where(el => el.neightbourType == NeightbourType.BottomDiagonal).ToArray();

            //сегментированный лес непересекающихся деревьев
            DisjointSet segmentedSet = SegmentOnDisjointSet(k, m_height * m_width, edges);  //картинка тут только для передачи размера потому осталась arrayImage

            //запоминание в поле для проведения оценки
            m_segmentedSet = segmentedSet;

            //debug
            System.Diagnostics.Debug.WriteLine("Segmented: " + DateTime.Now);

            //присоеденить те, что меньше min_size к соседу по ребру
            PostProcessSmallComponents(edges, segmentedSet, minSize);

            //debug
            System.Diagnostics.Debug.WriteLine("Small Component Merged: " + DateTime.Now);

            return(SegmentedSetConverter.ConvertToBitmap(segmentedSet, m_height, m_width, out m_componentLength));
            //var a = SegmentedSetConverter.ConvertToRealCoordsSegments(segmentedSet, height, width);
            //return SegmentedSetConverter.RealCoordsSegmentResultToBitmap(a);
        }
        public Bitmap DoSegmentation(Bitmap bmp, double sigma, double k, int minSize, IColorSheme colorSheme)
        {
            double[,,] arrayImage = BitmapConverter.BitmapToDoubleRgb(bmp);

            return(DoSegmentation(arrayImage, sigma, k, minSize, colorSheme));
        }
Esempio n. 12
0
        public static AssesmentsSegment[] ConvertToAssessmentSegments(DisjointSet segmentedSet, int height, int width, double[,,] arrayImage, IColorSheme colorSheme)
        {
            Dictionary <int, List <double[]> > segments = new Dictionary <int, List <double[]> >();

            for (int h = 0; h < height; h++)
            {
                for (int w = 0; w < width; w++)
                {
                    int             comp = segmentedSet.Find(h * width + w);
                    List <double[]> currentSegmentPointsList;

                    if (!segments.TryGetValue(comp, out currentSegmentPointsList))
                    {
                        currentSegmentPointsList = new List <double[]>();
                        segments.Add(comp, currentSegmentPointsList);
                    }

                    currentSegmentPointsList.Add(new double[] { arrayImage[0, h, w], arrayImage[1, h, w], arrayImage[2, h, w] });
                }
            }

            return(segments.Values.ToList()
                   .Select(segmentPoints => new AssesmentsSegment(segmentPoints))
                   .ToArray());
        }
 internal string name; //если вдруг будет нужно написать нормальное название
 internal abstract double GeAssessment(AssesmentsSegment[] segments, IColorSheme colorSheme);