public void ChooseContour(double areaProportion, int areaMinLimit, double heightPropotion) { Bitmap result = Image.Bitmap.Invert(); List <BlobEntity> objects = result.FindBlobs(); int maxArea = -1; int maxHeight = -1; // ReSharper disable PossibleLossOfFraction AForge.Point imageCenter = new AForge.Point(result.Width / 2, result.Height / 2); int targetObjectIndex = -1; // for (int i = 0; i < objects.Count; i++) { int currentArea = objects[i].Blob.Area; if (currentArea > maxArea) { maxArea = currentArea; targetObjectIndex = i; } int currentHeight = objects[i].Blob.Rectangle.Height; if (currentHeight > maxHeight) { maxHeight = currentHeight; } } ; int limitArea = Math.Min((int)(maxArea * areaProportion), areaMinLimit); int limitHeight = (int)(maxHeight * heightPropotion); double minDistanceToCenter = result.Height + result.Width; //Triangle inequality:) for (int i = 0; i < objects.Count; i++) { if ((objects[i].Blob.Area >= limitArea) && (objects[i].Blob.Rectangle.Height >= limitHeight)) { AForge.Point objectCenter = objects[i].Blob.CenterOfGravity; double distToCenter = Math.Sqrt(Math.Pow(objectCenter.X - imageCenter.X, 2) + Math.Pow(objectCenter.X - imageCenter.X, 2)); if (distToCenter < minDistanceToCenter) { minDistanceToCenter = distToCenter; targetObjectIndex = i; } } } _targetObject = new ElastoBlob(objects[targetObjectIndex]); for (int i = 0; i < objects.Count; i++) { if (i != targetObjectIndex) { Image.FillBlob(objects[i].Blob, SimpleGrayImage.WhiteBrightness); } } }
public ElastogramSignatura(ElastoBlob inputBlob, Segment inputFibroLine, VerificationStatus answer = VerificationStatus.NotCalculated) { Area = inputBlob.Blob.Area; FibroAngle = inputFibroLine.Equation.Angle; LeftAngle = inputBlob.LeftApproximation.Angle; RightAngle = inputBlob.RightApproximation.Angle; RSquareLeft = inputBlob.RSquareLeft; RSquareRight = inputBlob.RSquareRight; RelativeEstimationLeft = inputBlob.RelativeEstimationLeft; RelativeEstimationRight = inputBlob.RelativeEstimationRight; Answer = answer; }
private bool CheckForNull(ElastoBlob targetObject, Segment fibroLine) { if (targetObject.Blob.Area == 0) { return(true); } if (targetObject.LeftApproximation == null) { return(true); } if (targetObject.RightApproximation == null) { return(true); } if (fibroLine == null) { return(true); } if (Math.Abs(targetObject.RSquareLeft) < Double.Epsilon) { return(true); } if (Math.Abs(targetObject.RSquareLeft) < Double.Epsilon) { return(true); } if (Math.Abs(targetObject.RSquareRight) < Double.Epsilon) { return(true); } if (Math.Abs(targetObject.RelativeEstimationRight) < Double.Epsilon) { return(true); } if (Math.Abs(targetObject.RelativeEstimationLeft) < Double.Epsilon) { return(true); } return(false); }
public VerificationStatus Classiffy(ElastoBlob targetObject, Segment fibroLine) { if (CheckForNull(targetObject, fibroLine)) { return(VerificationStatus.NotCalculated); } int area = targetObject.Blob.Area; ReflectionedLine leftLine = targetObject.LeftApproximation; ReflectionedLine rightLine = targetObject.RightApproximation; double rSquareLeft = targetObject.RSquareLeft; double rSquareRight = targetObject.RSquareRight; double aLeft = targetObject.RelativeEstimationLeft; double aRight = targetObject.RelativeEstimationRight; if (area < 4000) { return(VerificationStatus.Uncertain); } if (area < 6000) { if ((angleDifference(leftLine, fibroLine.Equation) < VeryStrongAngleDif) && (angleDifference(leftLine, rightLine) < VeryStrongAngleDif) && (IsGoodTilt(leftLine)) && IsGoodApproximation(leftLine, rSquareLeft, aLeft) && IsGoodApproximation(rightLine, rSquareRight, aRight)) { return(VerificationStatus.Correct); } return(VerificationStatus.Uncertain); } if (area < 8000) { if (!IsGoodApproximation(leftLine, rSquareLeft, aLeft) || !IsGoodApproximation(rightLine, rSquareRight, aRight)) { return(VerificationStatus.Uncertain); } if ((angleDifference(leftLine, fibroLine.Equation) < WeakAngleDif) && (angleDifference(leftLine, rightLine) < WeakAngleDif) && (IsGoodTilt(leftLine))) { return(VerificationStatus.Correct); } return(VerificationStatus.Incorrect); } if (area < 10000) { if (!IsGoodApproximation(leftLine, rSquareLeft, aLeft) || !IsGoodApproximation(rightLine, rSquareRight, aRight)) { return(VerificationStatus.Uncertain); } if ((angleDifference(leftLine, fibroLine.Equation) < MeanAngleDif) && (angleDifference(leftLine, rightLine) < MeanAngleDif) && (IsGoodTilt(leftLine))) { return(VerificationStatus.Correct); } return(VerificationStatus.Incorrect); } if (area < 13500) { if (!IsGoodApproximation(leftLine, rSquareLeft, aLeft) || !IsGoodApproximation(rightLine, rSquareRight, aRight)) { return(VerificationStatus.Uncertain); } if ((angleDifference(leftLine, fibroLine.Equation) < StrongAngleDif) && (angleDifference(leftLine, rightLine) < StrongAngleDif) && (IsGoodTilt(leftLine))) { return(VerificationStatus.Correct); } return(VerificationStatus.Incorrect); } if (area < 21000) { if (IsGoodApproximation(leftLine, rSquareLeft, aLeft) && IsGoodApproximation(rightLine, rSquareRight, aRight)) { return(VerificationStatus.Incorrect); } return(VerificationStatus.Uncertain); } return(VerificationStatus.Uncertain); }