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