Exemplo n.º 1
0
        /// <summary>
        /// Masks an image of the same voxel count as the input doseGrid. Voxels inside the
        /// contour are filled with the specified color. Intent is white (0x255) on inside and outside
        /// areas/holes are left black (0x00)
        /// </summary>
        /// <param name="mask">the mask to fill or modify (recursively)</param>
        /// <param name="txMatrix">the patient transform matrix from the imagematrix/dosematrix</param>
        /// <param name="color">the color to fill the contour</param>
        /// <param name="scale">the scale of the image (in case the image has been resampled)</param>
        public void MaskImageFast(Mat mask, Mat txMatrix, byte color = 255, double scale = 1)
        {
            if (ContourPoints.Count == 0)
            {
                mask.SetArray(new byte[mask.Cols * mask.Rows]); return;
            }


            var allPoints = new Vec4f[ContourPoints.Count];
            var points    = ContourPoints.Select(c => new Vec4f(c.X, c.Y, Z, 1));

            using (var pointMat = new Mat <float>(new[] { ContourPoints.Count }, points.ToArray()))
            {
                var txPointMat = pointMat.Transform(txMatrix.Inv());
                txPointMat.GetArray(out allPoints);
            }
            var points2D = allPoints.Select(a => new Point(a.Item0 * scale, a.Item1 * scale)).ToList();

            Cv2.FillPoly(mask, new[] { points2D }, new Scalar(color), LineTypes.Link8);

            var grandchildren     = Children.SelectMany(c => c.Children);
            var outermostChildren = Children.Where(c => !grandchildren.Any(gc => gc == c));

            foreach (var child in outermostChildren)
            {
                //Recursively alternates black white to account for holes and fills of children contours
                child.MaskImageFast(mask, txMatrix, color == 255 ? (byte)0 : (byte)255);
            }
        }
Exemplo n.º 2
0
 public static List <Point3f> AsPoint3fs(this Mat mat)
 {
     if (mat.Channels() == 4)
     {
         var vals = new Vec4f[mat.Total()];
         mat.GetArray(0, 0, vals);
         return(vals.Select(v => new Point3f(v.Item0, v.Item1, v.Item2)).ToList());
     }
     else
     {
         var vals = new Point3f[mat.Total()];
         mat.GetArray(0, 0, vals);
         return(vals.ToList());
     }
 }
Exemplo n.º 3
0
        public static StructureMeta[] Find2DIsodoseLines(this Matrix matrix, params IsodoseLevel[] levels)
        {
            List <StructureMeta> metas = new List <StructureMeta>();

            foreach (var level in levels)
            {
                var meta = new StructureMeta()
                {
                    StructureId   = level.Value.ToString(),
                    StructureName = level.Value.ToString()
                };

                meta.Color = level.Color;

                for (int z = 0; z < matrix.DimensionZ; z++)
                {
                    using (var mat = matrix.GetZPlaneBySlice(z))
                    {
                        var ctrs = mat.Find2DIsodoseLine(level);
                        if (ctrs.Any())
                        {
                            foreach (var contour in ctrs)
                            {
                                var allPoints = new Vec4f[contour.Length];
                                var points    = contour.Select(c => new Vec4f(c.X, c.Y, z, 1));
                                using (var pointMat = new Mat <float>(new[] { contour.Length }, points.ToArray()))
                                {
                                    var txPointMat = pointMat.Transform(matrix.PatientTransformMatrix);
                                    txPointMat.GetArray(out allPoints);
                                }
                                var sliceContour = new SliceContourMeta();
                                var points3D     = allPoints.Select(a => new Point3f(a.Item0, a.Item1, a.Item2)).ToList();
                                points3D.ForEach(sliceContour.AddPoint);
                                meta.SliceContours.Add(sliceContour);
                            }
                        }
                    }
                }
                metas.Add(meta);
            }
            return(metas.ToArray());
        }
Exemplo n.º 4
0
 public static CameraSpacePoint[] ToCamSpacePoints(this Mat mat)
 {
     if (mat.Channels() == 4)
     {
         var vals = new Vec4f[mat.Total()];
         mat.GetArray(0, 0, vals);
         return(vals.Select(v => new CameraSpacePoint()
         {
             X = v.Item0, Y = v.Item1, Z = v.Item2
         }).ToArray());
     }
     else
     {
         var vals = new Point3f[mat.Total()];
         mat.GetArray(0, 0, vals);
         return(vals.Select(v => new CameraSpacePoint()
         {
             X = v.X, Y = v.Y, Z = v.Z
         }).ToArray());
     }
 }
Exemplo n.º 5
0
        public Mat DrawOnSlice(Mat txMatrix, Mat slice, double scale = 1)
        {
            var allPoints = new Vec4f[ContourPoints.Count];
            var points    = ContourPoints.Select(c => new Vec4f(c.X, c.Y, Z, 1));

            using (var pointMat = new Mat <float>(new[] { ContourPoints.Count }, points.ToArray()))
            {
                var txPointMat = pointMat.Transform(txMatrix.Inv());
                txPointMat.GetArray(out allPoints);
            }
            var    points2D = allPoints.Select(a => new Point(a.Item0 * scale, a.Item1 * scale)).ToList();
            double min, max;

            slice.MinMaxIdx(out min, out max);
            var color = slice.Type() == MatType.CV_8UC3? slice: slice.WindowAndLevel((max - min) / 2, max - min);

            Cv2.DrawContours(color, new[] { points2D }, 0, new Scalar(255, 255, 0));

            var grandchildren     = Children.SelectMany(c => c.Children);
            var outermostChildren = Children.Where(c => !grandchildren.Any(gc => gc == c));

            return(color);
        }