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);
                }
            }
        }
Beispiel #2
0
        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);
        }