private static int FindLargestRadiusIn(ShapeSignature signature) { int[][] signaturePoints = signature.Get(); int largestRadius = 0; for (int i = 0; i < signature.NumberOfSamplingPoints; i++) { int[] signaturePointsAtPosition = signaturePoints[i]; int largestRadiusAtIndex = signaturePointsAtPosition.Any() ? signaturePointsAtPosition.Max() : 0; if (largestRadiusAtIndex > largestRadius) { largestRadius = largestRadiusAtIndex; } } return(largestRadius); }
/// <summary> /// Gets the signature of an object in <paramref name="image"/> by using a variable number of sampling lines. /// </summary> /// <returns> /// The coordinates of the signature points in an ordered list. /// The key of the dictionary represents the index of the sampling point. /// The value represents the radius from the center of all pixels found. /// </returns> internal static ShapeSignature GetSignature(BinaryImage image, int numberOfSamplingLines) { CheckNumberOfSamplingLinesIsInRange(numberOfSamplingLines); var signature = new ShapeSignature(numberOfSamplingLines); int samplingIndex = 0; var samplingLines = GetSamplingLines(image, numberOfSamplingLines); foreach (var samplingLine in samplingLines) { int[] pointsInAngle = FindAllBlackPixelsOnSamplingLine(image, samplingLine).ToArray(); signature.Add(samplingIndex, pointsInAngle); samplingIndex++; } return(signature); }
internal static BinaryImage Plot(ShapeSignature signature) { int[][] signaturePoints = signature.Get(); int largestRadius = FindLargestRadiusIn(signature); var image = new BinaryImage(signature.NumberOfSamplingPoints, largestRadius + 3); for (int i = 0; i < signature.NumberOfSamplingPoints; i++) { int[] pointInAngle = signaturePoints[i]; for (int j = 0; j < pointInAngle.Length; j++) { int radius = pointInAngle[j]; image[radius, i] = BinaryImage.Black; } } return(image); }