private void DetermineClaster(ConnectedField field) { var cl1 = clasters[1]; var cl2 = clasters[2]; var euclidMetric1 = Math.Pow(Math.Pow(field.Area - cl1.Area, 2) + Math.Pow(field.Perimeter - cl1.Perimeter, 2) + Math.Pow(field.Density - cl1.Density, 2) + Math.Pow(field.Elongation - cl1.Elongation, 2), 0.5); var euclidMetric2 = Math.Pow(Math.Pow(field.Area - cl2.Area, 2) + Math.Pow(field.Perimeter - cl2.Perimeter, 2) + Math.Pow(field.Density - cl2.Density, 2) + Math.Pow(field.Elongation - cl2.Elongation, 2), 0.5); var clasterNumber = euclidMetric1 < euclidMetric2 ? 1 : 2; if (field.ClasterNumber != clasterNumber) { clasterizationReady = false; } field.ClasterNumber = clasterNumber; }
private void UpdateClastersCenter(ConnectedField claster, int clasterNumber) { var clasterFields = 0; var tempArea = 0; var tempPerimeter = 0; var tempDensity = 0d; var tempElongation = 0d; foreach (var i in connectedFields) { if (i.ClasterNumber != clasterNumber) continue; clasterFields++; tempArea += i.Area; tempPerimeter += i.Perimeter; tempDensity += i.Density; tempElongation += i.Elongation; } if (clasterFields == 0) return; claster.Area = tempArea / clasterFields; claster.Perimeter = tempPerimeter / clasterFields; claster.Density = tempDensity / clasterFields; claster.Elongation = tempElongation / clasterFields; }
private void CalculatePerimeter(ConnectedField field) { var perimeterBuf = 0; var xs = field.XStart; var ys = field.YStart; for (var i = xs; i < field.XEnd - 1; i++) { for (var j = ys; j < field.YEnd - 1; j++) { if ((Image.GetPixel(i - 1, j).R > 250 || Image.GetPixel(i + 1, j).R > 250 || Image.GetPixel(i, j - 1).R > 250 || Image.GetPixel(i, j + 1).R > 250) && Image.GetPixel(i, j).R < 250) { perimeterBuf++; } } } field.Perimeter = perimeterBuf; }
private void CalculateWeightCenters(ConnectedField field) { if (field.Area == 0) { throw new ArgumentException("First calculate area of object"); } var tempX = 1; var tempY = 1; for (var i = field.XStart; i < field.XEnd; i++) { for (var j = field.YStart; j < field.YEnd; j++) { if (imageMap[i, j] != 1) continue; tempX += i - field.XStart; tempY += j - field.YStart; } } // ReSharper disable once PossibleLossOfFraction field.WeightCenterX = tempX / field.Area; // ReSharper disable once PossibleLossOfFraction field.WeightCenterY = tempY / field.Area; }
private void CalculateElongationAndMainAxisOrientation(ConnectedField field) { double m11 = 0; double m20 = 0; double m02 = 0; for (var i = field.XStart; i < field.XEnd; i++) { for (var j = field.YStart; j < field.YEnd; j++) { if (imageMap[i, j] != 1) continue; m11 += (i - field.WeightCenterX - field.XStart) * (j - field.WeightCenterY - field.YStart); m20 += Math.Pow((i - field.WeightCenterX - field.XStart), 2); m02 += Math.Pow((j - field.WeightCenterY - field.YStart), 2); } } field.Elongation = (m20 + m02 + Math.Pow(Math.Pow(m20 - m02, 2) + 4*Math.Pow(m11, 2), 0.5))/ (m20 + m02 - Math.Pow(Math.Pow(m20 - m02, 2) + 4*Math.Pow(m11, 2), 0.5)); field.MainAxisOrientation = 0.5*Math.Atan(2*m11/(m20 - m02)); }
private void CalculateArea(ConnectedField field) { var area = 0; for (var i = field.XStart; i < field.XEnd; i++) { for (var j = field.YStart; j < field.YEnd; j++) { if (imageMap[i, j] == 1) { area++; } } } field.Area = area; }
private static void SetRandomValuesToField(ConnectedField field, int key) { if (key == 1) { field.Area = 1; field.Perimeter = 1; field.Density = 1; field.Elongation = 1; } if (key == 2) { field.Area = 2; field.Perimeter = 2; field.Density = 2; field.Elongation = 2; } }
private static void CalculateDensity(ConnectedField field) { field.Density = Math.Pow(field.Perimeter, 2)/field.Area; }
protected override void ProcessRecord() { var rc = new ConnectedField(connectionName, toCategoryName, fieldName); WriteObject(rc); }