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); }
public void Dispose() { if (SkeletonImage != null) { SkeletonImage.Dispose(); } }
/// <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)); }
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); }
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()); }
/// <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; } }
private byte ComputeRidgeCount(SkeletonImage skeletonImage, Minutia mtia0, Minutia mtia1) { return(skeletonImage.RidgeCount(mtia0.X, mtia0.Y, mtia1.X, mtia1.Y)); }