Example #1
0
        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);
        }
Example #2
0
        MutableTemplate Mutable()
        {
            var mutable = new MutableTemplate();

            mutable.Size     = Size;
            mutable.Minutiae = (from m in Minutiae select m.Mutable()).ToList();
            return(mutable);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }