public SemiAutomaticContourDTO Add(SemiAutomaticPointsDTO contour) { SemiAutomaticContourDTO result = SemiAutomatic.Default(contour); repository.Save(result); return(result); }
public void Save(SemiAutomaticContourDTO contour) { using (var db = new ContourContext()) { ContourEntity ce = new ContourEntity(); ce.ContourEntityId = contour.guid; ce.DicomId = contour.dicomid; ce.Tag = contour.tag; ce.IsManual = false; db.Contours.Add(ce); db.SaveChanges(); } string filename = "../data/semiautomatic/" + contour.guid.ToString() + ".csv"; StreamWriter sw = new StreamWriter(filename); sw.WriteLine(contour.guid.ToString()); sw.WriteLine(contour.dicomid.ToString()); sw.WriteLine(contour.tag); sw.WriteLine(string.Join(',', contour.lines.First().points.Select(s => s.x.ToString() + "," + s.y.ToString()))); sw.WriteLine(string.Join(',', contour.lines.First().pixels.Select(s => s.x.ToString() + "," + s.y.ToString()))); sw.WriteLine(contour.lines.First().brushColor); sw.WriteLine(contour.width); sw.WriteLine(contour.height); sw.WriteLine(contour.pixelSpacing); if (contour.statistics != null) { sw.WriteLine(contour.statistics.CenterOfMass.x + "," + contour.statistics.CenterOfMass.y); sw.WriteLine(string.Join(',', contour.statistics.Histogram)); sw.WriteLine(contour.statistics.HistogramMin); sw.WriteLine(contour.statistics.HistogramMax); sw.WriteLine(contour.statistics.HistogramMean); sw.WriteLine(contour.statistics.Area); sw.WriteLine(contour.statistics.Permieter); sw.WriteLine(contour.statistics.NumberOfPixelsInsideContour); sw.WriteLine(contour.statistics.NumberOfPixelsOfContour); sw.WriteLine(string.Join(',', contour.centralPoints.Select(s => s.x.ToString() + "," + s.y.ToString()))); } else { sw.WriteLine(); sw.WriteLine(); sw.WriteLine(); sw.WriteLine(); sw.WriteLine(); sw.WriteLine(); sw.WriteLine(); sw.WriteLine(); sw.WriteLine(); sw.WriteLine(); } sw.Close(); }
public ActionResult Put([FromBody] SemiAutomaticContourDTO contour) { if (logic.Edit(contour)) { return(Ok()); } return(BadRequest()); }
public bool Edit(SemiAutomaticContourDTO contour) { if (Delete(contour.guid)) { Save(contour); return(true); } return(false); }
public ActionResult <SemiAutomaticContourDTO> Get(Guid guid) { SemiAutomaticContourDTO contour = logic.Get(guid); if (contour == null) { return(NotFound()); } return(contour); }
public List <SemiAutomaticContourDTO> FetchByDicomIdToDTOs(string dicomid) { List <SemiAutomaticContourDTO> contours = new List <SemiAutomaticContourDTO>(); foreach (Guid guid in repository.FetchByDicomId(dicomid)) { SemiAutomaticContourDTO contour = repository.Load(guid); if (contour != null) { contours.Add(contour); } } return(contours); }
public List <SemiAutomaticContourDTO> FetchAllToDTOs() { List <SemiAutomaticContourDTO> contours = new List <SemiAutomaticContourDTO>(); foreach (Guid guid in repository.FetchAll()) { SemiAutomaticContourDTO contour = repository.Load(guid); if (contour != null) { contours.Add(contour); } } return(contours); }
public SemiAutomaticContourDTO Get(Guid guid) { SemiAutomaticContourDTO result = null; try { result = repository.Load(guid); } catch (Exception e) { Console.WriteLine("Catched exception: "); Console.WriteLine(e.ToString()); } return(result); }
public ActionResult <SemiAutomaticContourDTO> Post([FromBody] SemiAutomaticPointsDTO points) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } if (points == null) { return(BadRequest()); } if (points.lines == null) { return(BadRequest()); } if (points.lines.Count == 0) { return(BadRequest()); } foreach (var l in points.lines) { if (l.points == null) { return(BadRequest()); } if (l.points.Count < 3) { return(BadRequest()); } } SemiAutomaticContourDTO result = logic.Add(points); return(CreatedAtAction(nameof(Get), new { guid = result.guid }, result)); }
public static SemiAutomaticContourDTO Canny(SemiAutomaticPointsDTO points) { List <Point> pixels; StatisticsResult statisticsResult; (pixels, statisticsResult) = CannyAlgorithm.Canny(points.dicomid, points.lines.First().points, points.width, points.height, points.centralPoints, points.pixelSpacing); List <LinePointsAndPixels> lines = new List <LinePointsAndPixels>(); LinePointsAndPixels line = new LinePointsAndPixels(); line.points = new List <Point>(points.lines.First().points); line.pixels = new List <Point>(pixels); line.brushColor = points.lines.First().brushColor; lines.Add(line); SemiAutomaticContourDTO contour = new SemiAutomaticContourDTO(points.guid, points.dicomid, points.tag, lines, points.width, points.height, statisticsResult, points.centralPoints, points.pixelSpacing); return(contour); }
public static SemiAutomaticContourDTO TrivialContour(SemiAutomaticPointsDTO points) { List <Point> pixels = new List <Point>(); int count = points.lines.First().points.Count; for (int i = 0; i < points.lines.First().points.Count; i++) { int x1 = points.lines.First().points[i].x; int y1 = points.lines.First().points[i].y; int x2 = points.lines.First().points[(i + 1) % count].x; int y2 = points.lines.First().points[(i + 1) % count].y; List <Point> pixelsBresenham = new List <Point>(); BresenhamClass.Bresenham(pixelsBresenham, x1, y1, x2, y2); pixels = pixels.Concat(pixelsBresenham).ToList(); } List <LinePointsAndPixels> lines = new List <LinePointsAndPixels>(); LinePointsAndPixels line = new LinePointsAndPixels(); line.points = new List <Point>(points.lines.First().points); line.pixels = new List <Point>(pixels); line.brushColor = points.lines.First().brushColor; lines.Add(line); System.Drawing.Bitmap bitmap = OrthancConnection.GetBitmapByInstanceId(points.dicomid); int[,] matrixWithContour = CannyAlgorithm.MakeMatrixFromPoints(bitmap.Width, bitmap.Height, pixels); int[,] image = CannyAlgorithm.ReadMatrixFromBitmap(bitmap); StatisticsResult statisticsResult = Statistics.GenerateStatistics(pixels, matrixWithContour, image, 0, bitmap.Width, 0, bitmap.Height, 0, 0, points.centralPoints.First()); SemiAutomaticContourDTO contour = new SemiAutomaticContourDTO(points.guid, points.dicomid, points.tag, lines, points.width, points.height, statisticsResult, points.centralPoints, points.pixelSpacing); return(contour); }
public bool Edit(SemiAutomaticContourDTO contour) { SemiAutomaticContourDTO old = repository.Load(contour.guid); if (old == null) { return(false); } List <Point> newListOfPoints = new List <Point>(); int i = 0; int j = 0; int countOld = old.lines.First().points.Count; int countNew = contour.lines.First().points.Count; Point currentInOld = old.lines.First().points[i]; Point currentInNew = contour.lines.First().points[j]; while (i < countOld) { currentInOld = old.lines.First().points[i]; currentInNew = contour.lines.First().points[j]; while (currentInOld.x != currentInNew.x || currentInOld.y != currentInNew.y) { i++; currentInOld = old.lines.First().points[i]; } newListOfPoints.Add(currentInOld); i++; j++; if (j == countNew) { break; } } while (j < countNew) { double minDistance = double.MaxValue; int index = 0; for (int k = 0; k < newListOfPoints.Count; k++) { Point point1 = newListOfPoints[k]; Point point2 = newListOfPoints[(k + 1) % newListOfPoints.Count]; double A = point2.y - point1.y; double B = point1.x - point2.x; double C = point2.x * point1.y - point1.x * point2.y; double m = Math.Sqrt(A * A + B * B); double distance = Math.Abs(A * currentInNew.x + B * currentInNew.y + C) / m; if (distance < minDistance) { minDistance = distance; index = k; } } newListOfPoints.Insert(index, currentInNew); j++; } contour.lines.First().points = new List <Point>(newListOfPoints); List <LinePoints> list = new List <LinePoints>(); LinePoints line = new LinePoints(); line.points = new List <Point>(newListOfPoints); line.brushColor = contour.lines.First().brushColor; list.Add(line); SemiAutomaticPointsDTO contourPointsDTO = new SemiAutomaticPointsDTO(contour.guid, contour.dicomid, contour.tag, list, contour.width, contour.height, contour.centralPoints, contour.pixelSpacing); SemiAutomaticContourDTO result = SemiAutomatic.Default(contourPointsDTO); return(repository.Edit(result)); }
public SemiAutomaticContourDTO Load(Guid guid) { using (var db = new ContourContext()) { if (db.Contours.Where(c => c.ContourEntityId == guid).ToList().Count == 0) { return(null); } } string DICOMid; string tag; List <LinePointsAndPixels> lines = new List <LinePointsAndPixels>(); int width; int height; string buffor; string filename = "../data/semiautomatic/" + guid.ToString() + ".csv"; StreamReader sr = null; try { sr = new StreamReader(filename); } catch (Exception) { return(null); } if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } buffor = sr.ReadLine(); if (Guid.Parse(buffor) != guid) { throw new Exception($"Guid in file diffrent that in name of file {filename}"); } if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } DICOMid = sr.ReadLine(); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } tag = sr.ReadLine(); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } LinePointsAndPixels line = new LinePointsAndPixels(); line.pixels = new List <Point>(); line.points = new List <Point>(); buffor = sr.ReadLine(); List <int> points = buffor.Split(',').Select(s => int.Parse(s)).ToList(); int i = 0; while (i + 1 < points.Count) { line.points.Add(new Point(points[i++], points[i++])); } //It the same as: // while(i + 1 < points.Count) // { // line.pixels.Add(new Point(points[i], points[i+1])); // i += 2; // } // But it's look more funny buffor = sr.ReadLine(); points = buffor.Split(',').Select(s => int.Parse(s)).ToList(); while (i + 1 < points.Count) { line.pixels.Add(new Point(points[i++], points[i++])); } line.brushColor = sr.ReadLine(); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } lines.Add(line); buffor = sr.ReadLine(); width = int.Parse(buffor); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } buffor = sr.ReadLine(); height = int.Parse(buffor); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } string pixelSpacing = sr.ReadLine(); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } StatisticsResult statisticsResult = new StatisticsResult(); List <Point> centralPoints = new List <Point>(); buffor = sr.ReadLine(); if (buffor != "") { List <int> list = buffor.Split(',').Select(s => int.Parse(s)).ToList(); statisticsResult.CenterOfMass = new Point(list[0], list[1]); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } buffor = sr.ReadLine(); statisticsResult.Histogram = buffor.Split(',').Select(s => int.Parse(s)).ToArray(); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } buffor = sr.ReadLine(); statisticsResult.HistogramMin = int.Parse(buffor); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } buffor = sr.ReadLine(); statisticsResult.HistogramMax = int.Parse(buffor); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } buffor = sr.ReadLine(); statisticsResult.HistogramMean = double.Parse(buffor); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } buffor = sr.ReadLine(); statisticsResult.Area = double.Parse(buffor); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } buffor = sr.ReadLine(); statisticsResult.Permieter = double.Parse(buffor); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } buffor = sr.ReadLine(); statisticsResult.NumberOfPixelsInsideContour = int.Parse(buffor); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } buffor = sr.ReadLine(); statisticsResult.NumberOfPixelsOfContour = int.Parse(buffor); if (sr.EndOfStream) { throw new Exception($"Unexpected end of file {filename}"); } buffor = sr.ReadLine(); points = buffor.Split(',').Select(s => int.Parse(s)).ToList(); i = 0; while (i + 1 < points.Count) { centralPoints.Add(new Point(points[i++], points[i++])); } } sr.Close(); SemiAutomaticContourDTO contour = new SemiAutomaticContourDTO(guid, DICOMid, tag, lines, width, height, statisticsResult, centralPoints, pixelSpacing); return(contour); }