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