private static Parameters CalculateParameter(LabelGroup group, int[,] labels) { var result = new Parameters { Square = group.Pixels.Count }; int x = 0, y = 0, perimeter = 0; foreach (var item in group.Pixels) { if (IsBorderPixel(item.X, item.Y, ref labels)) { perimeter++; } x += item.X; y += item.Y; } result.SchtynhMasses = new Coords(x/result.Square, y/result.Square); result.Perimeter = perimeter; result.Density = (double)result.Perimeter*result.Perimeter / result.Square; var m20 = DiscretMoment(result.SchtynhMasses.X, result.SchtynhMasses.Y, group.Pixels, 2, 0); var m02 = DiscretMoment(result.SchtynhMasses.X, result.SchtynhMasses.Y, group.Pixels, 0, 2); var m11 = DiscretMoment(result.SchtynhMasses.X, result.SchtynhMasses.Y, group.Pixels, 1, 1); var sqrt = Math.Sqrt(Math.Pow(m20 - m02, 2) + 4*m11*m11); result.Elongation = (m20 + m02 + sqrt)/(m20 + m02 - sqrt); result.Theta = Math.Atan(2*m11/(m20 - m02)) / 2; result.Pixels = group.Pixels; return result; }
private static Dictionary<int, LabelGroup> FindLabelGroups(int[,] labels, int width, int height) { var dictionary = new Dictionary<int, LabelGroup>(); for (var i = 0; i < width; i++) { for (var j = 0; j < height; j++) { if (labels[i, j] == 0) { continue; } LabelGroup labelGroup; var item = labels[i, j]; if (!dictionary.TryGetValue(item, out labelGroup)) { labelGroup = new LabelGroup { Label = item, Pixels = new List<Coords>() }; dictionary.Add(item, labelGroup); } if (labelGroup != null) { labelGroup.Pixels.Add(new Coords(i, j)); } } } if (Configuration.IsDiscard) { var result = dictionary.Where(item => item.Value.Pixels.Count > Configuration.DiscardPixelsCount) .ToDictionary(item => item.Key, item => item.Value); return result; } return dictionary; }