Exemplo n.º 1
0
        //public List<Minutia> FilterMinutiae(List<Minutia> result, int[,] segment)
        //{
        //    var size = Constants.SegmentationWindowSize;

        //    var maxX = segment.GetLength(0);
        //    var maxY = segment.GetLength(1);

        //    var output = new List<Minutia>();

        //    foreach (var minutia in result)
        //    {
        //        var y = minutia.X/size;
        //        var x = minutia.Y/size;

        //        try
        //        {
        //            if (segment[x, y] == 1)
        //            {

        //                if (x > 0)
        //                {
        //                    if (segment[x - 1, y] == 0) continue;
        //                    if (y > 0) if (segment[x - 1, y - 1] == 0) continue;
        //                    if (y < maxY) if (segment[x - 1, y + 1] == 0) continue;
        //                }
        //                if (x < maxX)
        //                {
        //                    if (segment[x + 1, y] == 0) continue;
        //                    if (y > 0) if (segment[x + 1, y - 1] == 0) continue;
        //                    if (y < maxY) if (segment[x + 1, y + 1] == 0) continue;
        //                }
        //                if (y > 0)
        //                {
        //                    if (segment[x, y - 1] == 0) continue;
        //                }
        //                if (y < maxY)
        //                {
        //                    if (segment[x, y + 1] == 0) continue;
        //                }

        //                output.Add(minutia);
        //            }
        //        }
        //        catch (Exception)
        //        {

        //            throw;
        //        }

        //    }

        //    return output;
        //}
        public List <Minutia> FindMinutiae(float[] result, int rows, int columns, float[] orField, int orFieldRows, int orFieldColumns, int[,] mask)
        {
            var startImg  = result.Make2D(rows, columns).Select2D(x => (double)x);
            var orField2D = orField.Make2D(orFieldRows, orFieldColumns).Select2D(x => (double)x);

            var minutiae = MinutiaeDetection.FindMinutiae(startImg);
            //--------------------------------
            var trueMinutiae = new List <Minutia>();

            for (int i = 0; i < minutiae.Count; i++)
            {
                if (mask[minutiae[i].Y / Constants.SegmentationWindowSize, minutiae[i].X / Constants.SegmentationWindowSize] != 0)
                {
                    trueMinutiae.Add(minutiae[i]);
                }
            }
            minutiae = trueMinutiae;

            //--------------------------------
            minutiae = MinutiaeDetection.FindBigMinutiae(minutiae);

            MinutiaeDirection.FindDirection(orField2D.Select2D(x => Math.PI - x),
                                            Constants.OrFieldWindowSize - Constants.OrFieldOverlap, minutiae,
                                            startImg.Select2D(x => (int)x), 4);

            return(minutiae);
        }
Exemplo n.º 2
0
        public static List <CUDAFingerprinting.Common.Minutia> FindMinutiae(double[,] startImg, int rows, int columns, double[,] orField2D, int orFieldRows, int orFieldColumns, int[,] mask)
        {
            var minutiae = MinutiaeDetection.FindMinutiae(startImg);
            //--------------------------------
            var trueMinutiae = new List <CUDAFingerprinting.Common.Minutia>();

            for (int i = 0; i < minutiae.Count; i++)
            {
                if (mask[minutiae[i].Y / Constants.SegmentationWindowSize, minutiae[i].X / Constants.SegmentationWindowSize] != 0)
                {
                    trueMinutiae.Add(minutiae[i]);
                }
            }
            minutiae = trueMinutiae;

            //--------------------------------
            minutiae = MinutiaeDetection.FindBigMinutiae(minutiae);

            MinutiaeDirection.FindDirection(orField2D.Select2D(x => Math.PI - x),
                                            Constants.OrFieldWindowSize - Constants.OrFieldOverlap, minutiae,
                                            startImg.Select2D(x => (int)x), 4);

            return(minutiae);
        }
        public void FindDirectionTest()
        {
            for (int cur = 1; cur <= 10; cur++)
            {
                double[,] startImg = ImageHelper.LoadImage(TestResource.SampleFinger2);
                int imgHeight = startImg.GetLength(0);
                int imgWidth  = startImg.GetLength(1);
                //-------------------------------
                int[]   mask             = new int[imgHeight * imgWidth];
                int     windowSize       = 12;
                float   WeightConstant   = 0.3F;
                int     maskHeight       = imgHeight / windowSize;
                int     maskWidth        = imgWidth / windowSize;
                float[] imgToSegmentator = new float[imgHeight * imgWidth];
                for (int i = 0; i < imgHeight; i++)
                {
                    for (int j = 0; j < imgWidth; j++)
                    {
                        imgToSegmentator[i * imgWidth + j] = (float)startImg[i, j];
                    }
                }

                CUDASegmentator(imgToSegmentator, imgWidth, imgHeight, WeightConstant, windowSize, mask, maskWidth,
                                maskHeight);

                //----------------------------------

                double sigma = 1.4d;
                double[,] smoothing = LocalBinarizationCanny.Smoothing(startImg, sigma);
                double[,] sobel     = LocalBinarizationCanny.Sobel(smoothing);
                double[,] nonMax    = LocalBinarizationCanny.NonMaximumSupperession(sobel);
                nonMax = GlobalBinarization.Binarization(nonMax, 60);
                nonMax = LocalBinarizationCanny.Inv(nonMax);
                int sizeWin = 16;
                startImg = LocalBinarizationCanny.LocalBinarization(startImg, nonMax, sizeWin, 1.3d);
                startImg = GlobalBinarization.Binarization(startImg, 140);
                //-------------------------------

                startImg = Thining.ThinPicture(startImg);

                //-------------------------------
                for (int i = 0; i < imgHeight; i++)
                {
                    for (int j = 0; j < imgWidth; j++)
                    {
                        if (mask[i / windowSize * maskWidth + j / windowSize] == 0)
                        {
                            startImg[i, j] = 255;
                        }
                    }
                }
                //var path1 = System.IO.Path.GetTempPath() + "lol.png";
                //ImageHelper.SaveArray(startImg, path1);
                //-------------------------------

                int[,] BinaryImage         = ImageHelper.ConvertDoubleToInt(startImg);
                double[,] OrientationField =
                    Common.OrientationField.OrientationFieldGenerator.GenerateOrientationField(
                        BinaryImage);

                //-------------------------------
                Stopwatch sw = new Stopwatch();

                List <Minutia> Minutiae = MinutiaeDetection.FindMinutiae(startImg);
                //--------------------------------
                List <Minutia> TrueMinutiae = new List <Minutia>();
                for (int i = 0; i < Minutiae.Count; i++)
                {
                    if (mask[Minutiae[i].Y / windowSize * maskWidth + Minutiae[i].X / windowSize] != 0)
                    {
                        TrueMinutiae.Add(Minutiae[i]);
                    }
                }
                Minutiae = TrueMinutiae;

                //--------------------------------
                sw.Start();
                Minutiae = MinutiaeDetection.FindBigMinutiae(Minutiae);
                sw.Stop();
                //-------------------------------

                /*MinutiaeDirection.FindDirection(OrientationField, 16, Minutiae, BinaryImage, 1);
                 *
                 * //-------------------------------
                 *
                 * var path = "D:\\MyData\\Documents\\Results\\1\\" + cur + ".png";
                 * ImageHelper.MarkMinutiaeWithDirections(path1, Minutiae, path);
                 *
                 * //-------------------------------
                 *
                 * MinutiaeDirection.FindDirection(OrientationField, 16, Minutiae, BinaryImage, 4);
                 *
                 * //-------------------------------
                 *
                 * path = "D:\\MyData\\Documents\\Results\\2\\" + cur + ".png";
                 * ImageHelper.MarkMinutiaeWithDirections(path1, Minutiae, path);
                 *
                 * //-------------------------------
                 *
                 * MinutiaeDirection.FindDirection(OrientationField, 16, Minutiae, BinaryImage, 2);
                 *
                 * //-------------------------------
                 *
                 * path = "D:\\MyData\\Documents\\Results\\3\\" + cur + ".png";
                 * ImageHelper.MarkMinutiaeWithDirections(path1, Minutiae, path);*/

                //-------------------------------

                MinutiaeDirection.FindDirection(OrientationField, 16, Minutiae, BinaryImage, 4);

                Trace.WriteLine(string.Format("Minutiae detection and direction took {0} ms", sw.ElapsedMilliseconds));
                //-------------------------------

                var path = Path + Guid.NewGuid() + ".png";
                ImageHelper.MarkMinutiaeWithDirections(TestResource.SampleFinger2, Minutiae, path);
                Process.Start(path);
            }
        }
Exemplo n.º 4
0
        private static void TestDirectionsWithSegmentator()
        {
            double[,] startImg = ImageHelper.LoadImage(Resources._7_6start);
            int imgHeight = startImg.GetLength(0);
            int imgWidth  = startImg.GetLength(1);

            int[] mask           = new int[imgHeight * imgWidth];
            int   windowSize     = 12;
            float WeightConstant = 0.3F;
            int   maskHeight     = imgHeight / windowSize;
            int   maskWidth      = imgWidth / windowSize;

            float[] imgToSegmentator = new float[imgHeight * imgWidth];
            for (int i = 0; i < imgHeight; i++)
            {
                for (int j = 0; j < imgWidth; j++)
                {
                    imgToSegmentator[i * imgWidth + j] = (float)startImg[i, j];
                }
            }

            CUDASegmentator(imgToSegmentator, imgWidth, imgHeight, WeightConstant, windowSize, mask, maskWidth, maskHeight);


            double[,] binaryImage = ImageHelper.LoadImage(Resources._7_6);
            //---------------------------------------
            double sigma = 1.4d;

            double[,] smoothing = LocalBinarizationCanny.Smoothing(binaryImage, sigma);
            double[,] sobel     = LocalBinarizationCanny.Sobel(smoothing);
            double[,] nonMax    = LocalBinarizationCanny.NonMaximumSupperession(sobel);
            nonMax = GlobalBinarization.Binarization(nonMax, 60);
            nonMax = LocalBinarizationCanny.Inv(nonMax);
            int sizeWin = 16;

            binaryImage = LocalBinarizationCanny.LocalBinarization(binaryImage, nonMax, sizeWin, 1.3d);
            //---------------------------------------
            binaryImage = Thining.ThinPicture(binaryImage);
            //---------------------------------------
            List <Minutia> Minutiae = MinutiaeDetection.FindMinutiae(binaryImage);

            for (int i = 0; i < Minutiae.Count; i++)
            {
                if (mask[Minutiae[i].Y / windowSize * maskWidth + Minutiae[i].X / windowSize] == 0)
                {
                    Minutiae.Remove(Minutiae[i]);
                    i--;
                }
            }
            Minutiae = MinutiaeDetection.FindBigMinutiae(Minutiae);
            //--------------------------------------
            int[,] intImage            = ImageHelper.ConvertDoubleToInt(binaryImage);
            double[,] OrientationField = OrientationFieldGenerator.GenerateOrientationField(intImage);
            for (int i = 0; i < OrientationField.GetLength(0); i++)
            {
                for (int j = 0; j < OrientationField.GetLength(1); j++)
                {
                    if (OrientationField[i, j] < 0)
                    {
                        OrientationField[i, j] += Math.PI;
                    }
                }
            }
            MinutiaeDirection.FindDirection(OrientationField, 16, Minutiae, intImage, 4);

            /*for (int i = 0; i < imgHeight; i++)
             *  for (int j = 0; j < imgWidth; j++)
             *      if (mask[i/windowSize*maskWidth + j/windowSize] == 0)
             *          binaryImage[i, j] = 0;*/
            var path1 = Path.GetTempPath() + "binaryImage.png";

            ImageHelper.SaveArray(binaryImage, path1);
            var path2 = Path.GetTempPath() + "checkYourself.png";

            ImageHelper.MarkMinutiaeWithDirections(path1, Minutiae, path2);
            Process.Start(path2);
        }