Exemple #1
0
        public SemiAutomaticContourDTO Add(SemiAutomaticPointsDTO contour)
        {
            SemiAutomaticContourDTO result = SemiAutomatic.Default(contour);

            repository.Save(result);
            return(result);
        }
Exemple #2
0
        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();
        }
Exemple #3
0
 public ActionResult Put([FromBody] SemiAutomaticContourDTO contour)
 {
     if (logic.Edit(contour))
     {
         return(Ok());
     }
     return(BadRequest());
 }
Exemple #4
0
 public bool Edit(SemiAutomaticContourDTO contour)
 {
     if (Delete(contour.guid))
     {
         Save(contour);
         return(true);
     }
     return(false);
 }
Exemple #5
0
        public ActionResult <SemiAutomaticContourDTO> Get(Guid guid)
        {
            SemiAutomaticContourDTO contour = logic.Get(guid);

            if (contour == null)
            {
                return(NotFound());
            }

            return(contour);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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);
        }
Exemple #9
0
        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);
        }
Exemple #12
0
        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));
        }
Exemple #13
0
        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);
        }