Esempio n. 1
0
        private static double[,,] GenerateXSignature(int[,] normalizedImage)
        {
            var lro    = OrientationFieldGenerator.GenerateLocalRidgeOrientation(normalizedImage);
            int maxY   = lro.GetLength(0);
            int maxX   = lro.GetLength(1);
            var result = new double[maxY, maxX, L];

            for (int i = 0; i < maxY; i++)
            {
                for (int j = 0; j < maxX; j++)
                {
                    for (int k = 0; k < L; k++)
                    {
                        result[i, j, k] = 0;
                        for (int d = 0; d < W; d++)
                        {
                            int u = Convert.ToInt32(i + (d - W / 2) * Math.Cos(lro[i, j]) + (k - L / 2) * Math.Sin(lro[i, j]));
                            int v = Convert.ToInt32(j + (d - W / 2) * Math.Cos(lro[i, j]) + (L / 2 - k) * Math.Sin(lro[i, j]));
                            if (u >= 0 && u < maxY && v >= 0 && v < maxX)
                            {
                                result[i, j, k] += normalizedImage[u, v];
                            }
                            else
                            {
                                result[i, j, k] = -1;
                            }
                        }

                        if (result[i, j, k] != -1)
                        {
                            result[i, j, k] /= (double)W;
                        }
                    }
                }
            }
            return(result);
        }
Esempio n. 2
0
        public static double[,] GenerateInterpolatedFrequency(int[,] image)
        {
            var  freq               = GenerateFrequency(image);
            int  maxY               = freq.GetLength(0);
            int  maxX               = freq.GetLength(1);
            var  kernel             = OrientationFieldGenerator.GenerateGaussianKernel(3);
            int  size               = kernel.GetLength(0) / 2;
            int  w                  = 7;//kernel.GetLength(0);
            bool flag               = true;
            Func <double, double> m = x => (x <= 0 ? 0 : x);
            Func <double, double> b = x => (x <= 0 ? 0 : 1);

            while (flag)
            {
                for (int i = 0; i < maxY; i++)
                {
                    for (int j = 0; j < maxX; j++)
                    {
                        if (freq[i, j] == -1)
                        {
                            // Interpolation
                            double numerator   = 0;
                            double denominator = 0;

                            for (int u = -w / 2; u <= w / 2; u++)
                            {
                                for (int v = -w / 2; v <= w / 2; v++)
                                {
                                    int y = i - u * w;
                                    int x = j - v * w;
                                    if (x >= 0 && x < maxX && y >= 0 && y < maxY)
                                    {
                                        numerator   += kernel[u + size, v + size] * m(freq[y, x]);
                                        denominator += kernel[u + size, v + size] * b(freq[y, x] + 1);
                                    }
                                }
                            }
                            freq[i, j] = (denominator == 0 ? -1 : numerator / denominator);
                        }
                    }
                }

                // Check if there exist any -1 frequency
                flag = false;
                for (int i = 0; i < maxY; i++)
                {
                    for (int j = 0; j < maxX; j++)
                    {
                        if (freq[i, j] == -1)
                        {
                            flag = true;
                        }
                    }
                }
            }

            var result = new double[maxY, maxX];

            for (int i = 0; i < maxY; i++)
            {
                for (int j = 0; j < maxX; j++)
                {
                    result[i, j] = 0;
                    for (int dy = -w / 2; dy <= w / 2; dy++)
                    {
                        for (int dx = -w / 2; dx <= w / 2; dx++)
                        {
                            int x = j + dx * w;
                            int y = i + dy * w;
                            if (x >= 0 && x < maxX && y >= 0 && y < maxY)
                            {
                                result[i, j] += freq[y, x] * kernel[dy + size, dx + size];
                            }
                        }
                    }
                }
            }

            return(result);
        }