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(); }
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); }