Exemplo n.º 1
0
        internal JYMtiaDescriptor(SkeletonImage skeletonImage, List <Minutia> minutiae, short mainMtiaIdx, short mtiaIdx0, short mtiaIdx1)
        {
            this.minutiae    = minutiae;
            this.mainMtiaIdx = mainMtiaIdx;
            nearestMtiaIdx   = mtiaIdx0;
            farthestMtiaIdx  = mtiaIdx1;

            MtiaEuclideanDistance dist = new MtiaEuclideanDistance();

            dist0 = dist.Compare(MainMinutia, NearestMtia);
            dist1 = dist.Compare(MainMinutia, FarthestMtia);
            if (dist1 < dist0)
            {
                nearestMtiaIdx  = mtiaIdx1;
                farthestMtiaIdx = mtiaIdx0;
                double temp = dist0;
                dist0 = dist1;
                dist1 = temp;
            }

            alpha0 = ComputeAlpha(MainMinutia, NearestMtia);
            alpha1 = ComputeAlpha(MainMinutia, FarthestMtia);

            beta0 = ComputeBeta(MainMinutia, NearestMtia);
            beta1 = ComputeBeta(MainMinutia, FarthestMtia);

            ridgeCount0 = ComputeRidgeCount(skeletonImage, MainMinutia, NearestMtia);
            ridgeCount1 = ComputeRidgeCount(skeletonImage, MainMinutia, FarthestMtia);
        }
Exemplo n.º 2
0
 public void Dispose()
 {
     if (SkeletonImage != null)
     {
         SkeletonImage.Dispose();
     }
 }
Exemplo n.º 3
0
        /// <summary>
        ///     Extract features of type <see cref="JYFeatures"/> from the specified minutiae and skeleton image.
        /// </summary>
        /// <param name="minutiae">
        ///     The minutia list to extract the features from.
        /// </param>
        /// <param name="skeletonImg">
        ///     The skeleton image to extract the features from.
        /// </param>
        /// <returns>
        ///     Features of type <see cref="JYFeatures"/> extracted from the specified minutiae and skeleton image.
        /// </returns>
        public JYFeatures ExtractFeatures(List <Minutia> minutiae, SkeletonImage skeletonImg)
        {
            var descriptorsList = new List <JYMtiaDescriptor>();

            if (minutiae.Count > 3)
            {
                var mtiaIdx = new Dictionary <Minutia, int>();
                for (int i = 0; i < minutiae.Count; i++)
                {
                    mtiaIdx.Add(minutiae[i], i);
                }
                for (Int16 idx = 0; idx < minutiae.Count; idx++)
                {
                    Minutia query   = minutiae[idx];
                    Int16[] nearest = GetNearest(minutiae, query);
                    for (int i = 0; i < nearest.Length - 1; i++)
                    {
                        for (int j = i + 1; j < nearest.Length; j++)
                        {
                            JYMtiaDescriptor newMTriplet = new JYMtiaDescriptor(skeletonImg, minutiae, idx, nearest[i],
                                                                                nearest[j]);
                            descriptorsList.Add(newMTriplet);
                        }
                    }
                }
                descriptorsList.TrimExcess();
            }
            return(new JYFeatures(descriptorsList));
        }
Exemplo n.º 4
0
        internal JiangMinutiaDescriptor(SkeletonImage skeletonImage, List <Minutia> minutiae, short mainMtiaIdx,
                                        short mtiaIdx0, short mtiaIdx1)
        {
            Minutiae        = minutiae;
            MainMtiaIdx     = mainMtiaIdx;
            NearestMtiaIdx  = mtiaIdx0;
            FarthestMtiaIdx = mtiaIdx1;

            Dist0 = MtiaEuclideanDistance.Compare(MainMinutia, NearestMtia);
            Dist1 = MtiaEuclideanDistance.Compare(MainMinutia, FarthestMtia);
            if (Dist1 < Dist0)
            {
                NearestMtiaIdx  = mtiaIdx1;
                FarthestMtiaIdx = mtiaIdx0;
                var temp = Dist0;
                Dist0 = Dist1;
                Dist1 = temp;
            }

            Alpha0 = ComputeAlpha(MainMinutia, NearestMtia);
            Alpha1 = ComputeAlpha(MainMinutia, FarthestMtia);

            Beta0 = ComputeBeta(MainMinutia, NearestMtia);
            Beta1 = ComputeBeta(MainMinutia, FarthestMtia);

            RidgeCount0 = ComputeRidgeCount(skeletonImage, MainMinutia, NearestMtia);
            RidgeCount1 = ComputeRidgeCount(skeletonImage, MainMinutia, FarthestMtia);
        }
Exemplo n.º 5
0
        public PointF[] GenerateSpine(PointF headPoint, PointF tailPoint)
        {
            int cycles = NumberOfCycles;
            Image <Gray, Byte> workingImage = SkeletonImage.Clone();

            while (cycles > 0)
            {
                using (Image <Gray, Byte> dilate1 = workingImage.Dilate(NumberOfIterations))
                    using (Image <Gray, Byte> erode1 = dilate1.Erode(NumberOfIterations))
                    {
                        workingImage.Dispose();
                        workingImage = erode1.Clone();
                    }

                cycles--;
            }

            LineSegment2D[] lines = CvInvoke.HoughLinesP(workingImage,
                                                         1,            //Distance resolution in pixel-related units
                                                         Math.PI / 45, //Angle resolution measured in radians.
                                                         20,           //threshold
                                                         5,            //min Line width
                                                         40);          //gap between lines

            LineSegment2D[] spineLines = FindSpine(lines, RotatedRectangle, workingImage, headPoint, tailPoint);

            if (spineLines == null)
            {
                return(null);
            }

            //Smooth lines out
            List <PointF> smoothPoints = new List <PointF>();

            smoothPoints.Add(spineLines[0].P1);

            foreach (var line in spineLines)
            {
                smoothPoints.Add(line.P2);
            }

            return(smoothPoints.ToArray());
        }
Exemplo n.º 6
0
 /// <summary>
 ///     Extract features of type <see cref="JYFeatures"/> from the specified image.
 /// </summary>
 /// <remarks>
 ///     This method uses the properties <see cref="MtiaExtractor"/> and <see cref="SkeletonImgExtractor"/> to extract features, so it raises an exception if any of these properties is not assigned.
 /// </remarks>
 /// <exception cref="InvalidOperationException">
 ///     Thrown when the minutia list extractor is not assigned or the skeleton image extractor is not assigned.
 /// </exception>
 /// <param name="image">The source image to extract features from.</param>
 /// <returns>
 ///     Features of type <see cref="JYFeatures"/> extracted from the specified image.
 /// </returns>
 public override JYFeatures ExtractFeatures(Bitmap image)
 {
     try
     {
         List <Minutia> minutiae    = MtiaExtractor.ExtractFeatures(image);
         SkeletonImage  skeletonImg = SkeletonImgExtractor.ExtractFeatures(image);
         return(ExtractFeatures(minutiae, skeletonImg));
     }
     catch (Exception e)
     {
         if (MtiaExtractor == null)
         {
             throw new InvalidOperationException("Unable to extract JYFeatures: Unassigned minutia list extractor!", e);
         }
         if (SkeletonImgExtractor == null)
         {
             throw new InvalidOperationException("Unable to extract JYFeatures: Unassigned skeleton image extractor!", e);
         }
         throw;
     }
 }
Exemplo n.º 7
0
 private byte ComputeRidgeCount(SkeletonImage skeletonImage, Minutia mtia0, Minutia mtia1)
 {
     return(skeletonImage.RidgeCount(mtia0.X, mtia0.Y, mtia1.X, mtia1.Y));
 }