public static MutableTemplate Extract(DoubleMatrix raw, double dpi) { var template = new MutableTemplate(); // https://sourceafis.machinezoo.com/transparency/decoded-image FingerprintTransparency.Current.Log("decoded-image", raw); if (Math.Abs(dpi - 500) > Parameters.DpiTolerance) { raw = ScaleImage(raw, dpi); } // https://sourceafis.machinezoo.com/transparency/scaled-image FingerprintTransparency.Current.Log("scaled-image", raw); template.Size = raw.Size; var blocks = new BlockMap(raw.Width, raw.Height, Parameters.BlockSize); // https://sourceafis.machinezoo.com/transparency/blocks FingerprintTransparency.Current.Log("blocks", blocks); var histogram = Histogram(blocks, raw); var smoothHistogram = SmoothHistogram(blocks, histogram); var mask = Mask(blocks, histogram); var equalized = Equalize(blocks, raw, smoothHistogram, mask); var orientation = OrientationMap(equalized, mask, blocks); var smoothedLines = OrientedLines(Parameters.ParallelSmoothingResolution, Parameters.ParallelSmoothingRadius, Parameters.ParallelSmoothingStep); var smoothed = SmoothRidges(equalized, orientation, mask, blocks, 0, smoothedLines); // https://sourceafis.machinezoo.com/transparency/parallel-smoothing FingerprintTransparency.Current.Log("parallel-smoothing", smoothed); var orthogonalLines = OrientedLines(Parameters.OrthogonalSmoothingResolution, Parameters.OrthogonalSmoothingRadius, Parameters.OrthogonalSmoothingStep); var orthogonal = SmoothRidges(smoothed, orientation, mask, blocks, Math.PI, orthogonalLines); // https://sourceafis.machinezoo.com/transparency/orthogonal-smoothing FingerprintTransparency.Current.Log("orthogonal-smoothing", orthogonal); var binary = Binarize(smoothed, orthogonal, mask, blocks); var pixelMask = FillBlocks(mask, blocks); CleanupBinarized(binary, pixelMask); // https://sourceafis.machinezoo.com/transparency/pixel-mask FingerprintTransparency.Current.Log("pixel-mask", pixelMask); var inverted = Invert(binary, pixelMask); var innerMask = InnerMask(pixelMask); var ridges = new Skeleton(binary, SkeletonType.Ridges); var valleys = new Skeleton(inverted, SkeletonType.Valleys); template.Minutiae = new List <MutableMinutia>(); CollectMinutiae(template.Minutiae, ridges, MinutiaType.Ending); CollectMinutiae(template.Minutiae, valleys, MinutiaType.Bifurcation); // https://sourceafis.machinezoo.com/transparency/skeleton-minutiae FingerprintTransparency.Current.Log("skeleton-minutiae", template); MaskMinutiae(template.Minutiae, innerMask); // https://sourceafis.machinezoo.com/transparency/inner-minutiae FingerprintTransparency.Current.Log("inner-minutiae", template); RemoveMinutiaClouds(template.Minutiae); // https://sourceafis.machinezoo.com/transparency/removed-minutia-clouds FingerprintTransparency.Current.Log("removed-minutia-clouds", template); template.Minutiae = LimitTemplateSize(template.Minutiae); // https://sourceafis.machinezoo.com/transparency/top-minutiae FingerprintTransparency.Current.Log("top-minutiae", template); return(template); }
MutableTemplate Mutable() { var mutable = new MutableTemplate(); mutable.Size = Size; mutable.Minutiae = (from m in Minutiae select m.Mutable()).ToList(); return(mutable); }
public MutableTemplate Mutable() { var mutable = new MutableTemplate(); mutable.Size = new IntPoint(Width, Height); mutable.Minutiae = new List <MutableMinutia>(); for (int i = 0; i < Types.Length; ++i) { var type = Types[i] == 'B' ? MinutiaType.Bifurcation : MinutiaType.Ending; mutable.Minutiae.Add(new MutableMinutia(new IntPoint(PositionsX[i], PositionsY[i]), Directions[i], type)); } return(mutable); }
FingerprintTemplate(MutableTemplate mutable) { Size = mutable.Size; var minutiae = from m in mutable.Minutiae orderby((m.Position.X * Prime) + m.Position.Y) * Prime, m.Position.X, m.Position.Y, m.Direction, m.Type select new ImmutableMinutia(m); Minutiae = minutiae.ToArray(); // https://sourceafis.machinezoo.com/transparency/shuffled-minutiae FingerprintTransparency.Current.Log("shuffled-minutiae", () => Mutable()); Edges = NeighborEdge.BuildTable(Minutiae); }
public PersistentTemplate(MutableTemplate mutable) { Version = FingerprintCompatibility.Version; Width = mutable.Size.X; Height = mutable.Size.Y; int count = mutable.Minutiae.Count; PositionsX = new int[count]; PositionsY = new int[count]; Directions = new double[count]; var chars = new char[count]; for (int i = 0; i < count; ++i) { var minutia = mutable.Minutiae[i]; PositionsX[i] = minutia.Position.X; PositionsY[i] = minutia.Position.Y; Directions[i] = minutia.Direction; chars[i] = minutia.Type == MinutiaType.Bifurcation ? 'B' : 'E'; } Types = new string(chars); }