public static double[] ComputeRegressionNumerics(LasFile file, LasPoint point, int count, int radiusSector)
        {
            var neighbours = file.LasPointDataRecords.GetNeighbours(point, count, radiusSector);

            double[][] xy = new double[neighbours.Count][];
            double[]   z  = new double[neighbours.Count];

            for (int i = 0; i < neighbours.Count; i++)
            {
                xy[i] = new double[] { neighbours[i].X, neighbours[i].Y };
                z[i]  = neighbours[i].Z;
            }
            double[] p = MultipleRegression.QR(xy, z);

            return(p);
        }
Example #2
0
        public static Tuple <double[][], int[]> MakeInputOutputs(List <LasPoint> points, LasFile file)
        {
            int count = points.Count;

            int[]      outputs = new int[count];
            double[][] inputs  = new double[count][];

            for (int i = 0; i < count; i++)
            {
                LasPoint point = points[i];

                Console.WriteLine("Preparing Teaching Dataset " + i + "/" + count);
                var inout = GetInputOutputFromClassificationType(point, file);
                inputs[i]  = inout.Item1;
                outputs[i] = inout.Item2;
            }
            return(new Tuple <double[][], int[]>(inputs, outputs));
        }
        public static Tuple <double[], int> GetInputOutputFromClassificationType(LasPoint point, LasFile file)
        {
            var            abc = LinearRegression.ComputeRegressionPoint(file, point, regressionCount, regressionRange);
            double         distanceFromPlane = Utills.DistanceFromPlane(point, abc);
            LasPoint3Short pointShort        = (LasPoint3Short)point;
            double         green             = pointShort.Green - (pointShort.Red + pointShort.Blue) / 2;
            var            input             = new double[] { green, file.LasHeader.ScaleZ(point.Z), point.Intensity, abc.X, abc.Y, abc.Z, distanceFromPlane };
            int            output;

            switch (point.Classification)
            {
            case LasPoint.ClassificationType.Ground:
                output = 0;
                break;

            case LasPoint.ClassificationType.HighVegetation:
                output = 1;
                break;

            case LasPoint.ClassificationType.Building:
                output = 2;
                break;

            case LasPoint.ClassificationType.MediumVegetation:
                output = 3;
                break;

            case LasPoint.ClassificationType.LowVegetation:
                output = 4;
                break;

            case LasPoint.ClassificationType.Water:
                output = 5;
                break;

            default:
                input  = new double[] { -1, -1, -1, -1, -1, -1, -1 };
                output = 6;
                break;
            }
            return(Tuple.Create(input, output));
        }
Example #4
0
        public static Tuple <double[], int> GetInputOutputFromClassificationType(LasPoint point, LasFile file)
        {
            LasPoint3Short pointShort = (LasPoint3Short)point;
            double         green      = pointShort.Green - (pointShort.Red + pointShort.Blue) / 2;
            var            input      = new double[] { file.LasHeader.ScaleZ(point.Z), point.Intensity, green };
            int            output;

            switch (point.Classification)
            {
            case LasPoint.ClassificationType.Ground:
                output = 0;
                break;

            case LasPoint.ClassificationType.HighVegetation:
                output = 1;
                break;

            case LasPoint.ClassificationType.Building:
                output = 2;
                break;

            case LasPoint.ClassificationType.MediumVegetation:
                output = 3;
                break;

            case LasPoint.ClassificationType.LowVegetation:
                output = 4;
                break;

            case LasPoint.ClassificationType.Water:
                output = 5;
                break;

            default:
                input  = new double[] { -1, -1, -1 };
                output = 6;
                break;
            }
            return(Tuple.Create(input, output));
        }
        public static Vector3 ComputeRegressionPoint(LasFile file, LasPoint point, int count, int radiusSector)
        {
            var neighbours = file.LasPointDataRecords.GetNeighbours(point, count, radiusSector);

            double[,] matrix = new double[3, 3];
            double[,] vector = new double[1, 3];

            foreach (var item in neighbours)
            {
                matrix[0, 0] += item.X * item.X;
                matrix[0, 1] += item.X * item.Y;
                matrix[0, 2] += item.X;
                matrix[1, 0] += item.X * item.Y;
                matrix[1, 1] += item.Y * item.Y;
                matrix[1, 2] += item.Y;
                matrix[2, 0] += item.X;
                matrix[2, 1] += item.Y;

                vector[0, 0] += item.X * item.Z;
                vector[0, 1] += item.Y * item.Z;
                vector[0, 2] += item.Z;
            }
            matrix[2, 2] = neighbours.Count;


            Matrix <double> a = DenseMatrix.OfArray(matrix);
            Matrix <double> b = DenseMatrix.OfArray(vector);

            a = a.Inverse();

            Matrix <double> x = b.Multiply(a);

            var tempArray = x.ToArray();

            Vector3 abc = new Vector3(Convert.ToSingle(tempArray[0, 0]), Convert.ToSingle(tempArray[0, 1]), Convert.ToSingle(tempArray[0, 2]));

            return(abc);
        }
Example #6
0
 public static double DistanceFromPlane(LasPoint point, Vector3 abc)
 {
     return(((abc.X * point.X) + (abc.Y * point.Y) + (abc.Z * point.Z)) / ((abc.X * abc.X) + (abc.Y * abc.Y) + (abc.Z * abc.Z)));
 }