Esempio n. 1
0
        static void Main(string[] args)
        {
            string[]     pathes = Directory.GetFiles("C:\\Users\\Tanya\\Documents\\tests_data\\db");
            StreamWriter writer = new StreamWriter("C:\\Users\\Tanya\\Documents\\Results\\AlgorithmVSCOMEResult.txt", true);

            for (int i = 0; i < 3 /*pathes.GetLength(0)*/; i++)
            {
                Tuple <int, int> redPoint = ImageHelper.FindColorPoint(pathes[i]);
                double[,] imgBytes = ImageEnhancementHelper.EnhanceImage(ImageHelper.LoadImage(pathes[i]));

                double[,] orientationField         = OrientationFieldGenerator.GenerateOrientationField(imgBytes.Select2D(x => (int)x));
                Complex[,] complexOrientationField = orientationField.Select2D(x => (new Complex(Math.Cos(2 * x), Math.Sin(2 * x))));

                Complex[,] filter = Filter.GetFilter(orientationField);
                Complex[,] complexFilteredField = ConvolutionHelper.ComplexConvolve(complexOrientationField, filter);
                double[,] filteredField         = complexFilteredField.Select2D(x => x.Magnitude);

                VSCOME vscome = new VSCOME(orientationField, filteredField);

                double[,] vscomeValue = vscome.CalculateVscomeValue();
                Tuple <int, int> corePoint = KernelHelper.Max2dPosition(vscomeValue);

                writer.WriteLine(GetDistance(redPoint, corePoint));

                // ImageHelper.SaveArray(orientationField, "C:\\Users\\Tanya\\Documents\\Results\\orientationField.jpg");
                // ImageHelper.SaveArray(filteredField, "C:\\Users\\Tanya\\Documents\\Results\\filteredField.jpg");
                //ImageHelper.SaveArray(vscomeValue, "C:\\Users\\Tanya\\Documents\\Results\\vscomeValue_1.jpg");
            }

            writer.Close();
        }
Esempio n. 2
0
        public static Complex[,] ComplexConvolve(Complex[,] data, Complex[,] kernel)
        {
            var dataReal      = data.Select2D(x => x.Real);
            var dataImaginary = data.Select2D(x => x.Imaginary);

            var kernelReal      = kernel.Select2D(x => x.Real);
            var kernelImaginary = kernel.Select2D(x => x.Imaginary);

            var resultRealPart1 = Convolve(dataReal, kernelReal);
            var resultRealPart2 = Convolve(dataImaginary, kernelImaginary);

            var resultImaginaryPart1 = Convolve(dataReal, kernelImaginary);
            var resultImaginaryPart2 = Convolve(dataImaginary, kernelReal);

            return(KernelHelper.MakeComplexFromDouble(
                       KernelHelper.Subtract(resultRealPart1, resultRealPart2),
                       KernelHelper.Add(resultImaginaryPart1, resultImaginaryPart2)));
        }
        private static List <Minutia> SearchMinutiae(Complex[,] psi, Complex[,] lsEnhanced, Complex[,] ps)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();
            var size = new Size(psi.GetLength(0), psi.GetLength(1));

            for (int x = 0; x < size.Width; x++)
            {
                for (int y = 0; y < size.Height; y++)
                {
                    if (psi[x, y].Magnitude < tauPS)
                    {
                        psi[x, y] = 0;
                    }
                }
            }

            var grid = new int[psi.GetLength(0), psi.GetLength(1)];

            var maxs = psi.Select2D((x, row, column) =>
            {
                Point maxP  = new Point();
                double maxM = tauPS;
                for (int dRow = -NeighborhoodSize / 2; dRow <= NeighborhoodSize / 2; dRow++)
                {
                    for (int dColumn = -NeighborhoodSize / 2; dColumn <= NeighborhoodSize / 2; dColumn++)
                    {
                        var correctRow    = row + dRow;
                        var correctColumn = column + dColumn;

                        if (correctRow > 9 && correctColumn > 9 &&
                            correctColumn < psi.GetLength(1) - 10 && correctRow < psi.GetLength(0) - 10)
                        {
                            var value = psi[correctRow, correctColumn];
                            if (value.Magnitude > maxM)
                            {
                                maxM = value.Magnitude;
                                maxP = new Point(correctRow, correctColumn);
                            }
                        }
                    }
                }
                if (!maxP.IsEmpty)
                {
                    grid[maxP.X, maxP.Y]++;
                }
                return(maxP);
            });

            Dictionary <Point, int> responses = new Dictionary <Point, int>();

            foreach (var point in maxs)
            {
                if (!responses.ContainsKey(point))
                {
                    responses[point] = 0;
                }
                responses[point]++;
            }


            ImageHelper.SaveArrayAsBinary(grid, "C:\\temp\\grid.bin");
            var orderedListOfCandidates =
                responses.Where(x => x.Value >= 20 && x.Key.X > 0 && x.Key.Y > 0 && x.Key.X < psi.GetLength(0) - 1 && x.Key.Y < psi.GetLength(1) - 1)
                .OrderByDescending(x => x.Value)
                .Select(x => x.Key)
                .Where(x => psi[x.X, x.Y].Magnitude >= tauPS);
            List <Minutia> minutiae = new List <Minutia>();
            int            cnt      = 0;

            foreach (var candidate in orderedListOfCandidates)
            {
                int    count = 0;
                double sum   = 0;
                for (int dx = -ringOuterRadius; dx <= ringOuterRadius; dx++)
                {
                    for (int dy = -ringOuterRadius; dy <= ringOuterRadius; dy++)
                    {
                        if (Math.Abs(dx) < ringInnerRadius && Math.Abs(dy) < ringInnerRadius)
                        {
                            continue;
                        }
                        count++;
                        int xx = candidate.X + dx;
                        if (xx < 0)
                        {
                            xx = 0;
                        }
                        if (xx >= size.Width)
                        {
                            xx = size.Width - 1;
                        }
                        int yy = candidate.Y + dy;
                        if (yy < 0)
                        {
                            yy = 0;
                        }
                        if (yy >= size.Height)
                        {
                            yy = size.Height - 1;
                        }
                        sum += lsEnhanced[xx, yy].Magnitude;
                    }
                }
                if (sum / count > tauLS)
                {
                    cnt++;
                    if (!minutiae.Any(pt => (pt.X - candidate.X) * (pt.X - candidate.X) + (pt.Y - candidate.Y) * (pt.Y - candidate.Y) < 30))
                    {
                        minutiae.Add(new Minutia()
                        {
                            X = candidate.X, Y = candidate.Y, Angle = ps[candidate.X, candidate.Y].Phase
                        });
                    }
                }
            }

            var endList = minutiae.OrderByDescending(x =>
                                                     ps[x.X, x.Y].Magnitude)
                          .Take(MaxMinutiaeCount)
                          .ToList();

            sw.Stop();
            return(endList);
        }