User 6976447 Ответов: 0

Реализация ориентированного полосового фильтра?


В этой исследовательской работе,

Разнонаправленное обнаружение царапин и восстановление оцифрованных старых изображений | SpringerLink[^]

в разделе 4.1(предварительная обработка) приведено уравнение полосового фильтра:

https://qph.ec.quoracdn.net/main-qimg-acdd986df7a8871b6f0cc0a89893be50?convert_to_webp=true

Где,

https://qph.ec.quoracdn.net/main-qimg-a35b53df0146418f4864693e32b6c130?convert_to_webp=true[^]

Теперь я реализовал это следующим образом:

он работает, ApplyFilterToOneCoordinate фактически возвращает NaN,

Главная | .Чистая Скрипка[^]
Главная | .Чистая Скрипка[^]

Но этот код ничего не производит:

https://qph.ec.quoracdn.net/main-qimg-a65ec9502571e5303b898d6a5f6a06ee?convert_to_webp=true[^]


https://qph.ec.quoracdn.net/main-qimg-e3f4aa9a2da5cb00167a3681c5d5d1a3?convert_to_webp=true[^]

https://qph.ec.quoracdn.net/main-qimg-5daf6ad8c2bcbf71f172fba1d5b44a1c?convert_to_webp=true[^]

https://qph.ec.quoracdn.net/main-qimg-0f0f86a58efa78611fc907d7a8e2231b?convert_to_webp=true[^]

Что я уже пробовал:

public class KassWitkin
    {
        private static double tx(double centerX, double theta)
        {
            return centerX * Math.Cos(theta);
        }

        private static double ty(double centerY, double theta)
        {
            return centerY * Math.Sin(theta);
        }

        private static double u_star(double u, double centerX, double centerY, double theta)
        {
            double txx = tx(centerX, theta);
            double tyy = ty(centerY, theta);

            double cost = Math.Cos(theta);
            double sint = Math.Sin(theta);

            double costutxx = cost * (u + txx);
            double sintutyy = sint * (u + tyy);
            return costutxx + sintutyy;
        }

        private static double v_star(double u, double centerX, double centerY, double theta)
        {
            return (-1) * Math.Sin(theta) * (u + tx(centerX, theta))
                        + Math.Cos(theta) * (u + ty(centerY, theta));
        }

        public static double ApplyFilterOnOneCoord(double u, double v, double Dh, double Dv, double CenterX, double CenterY, double Theta, int N)
        {
            double u_star = KassWitkin.u_star(u, CenterX, CenterY, Theta);
            double v_star = KassWitkin.v_star(u, CenterX, CenterY, Theta);

            double uStarDh = (u_star / Dh);
            double vStarDh = (v_star / Dv);
            double sqrts = Math.Sqrt(uStarDh + vStarDh);
            double power = Math.Pow(sqrts, 2 * N);
            double divvy = (1 + 0.414 * power);
            double returns = 1 / divvy;

            return returns;
        }
    }

    public class KassWitkinBandpassFilter
    {
        public readonly int N = 4;
        public double Dh { get; set; }
        public double Dv { get; set; }
        public double CenterX { get; set; }
        public double CenterY { get; set; }
        public double Theta { get; set; }

        ///http://stackoverflow.com/questions/37769350/how-can-i-create-a-bank-of-oriented-band-pass-filters
        private double[,] GetKernel(int width, int height)
        {
            double[,] kernel2d = new double[width, height];

            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    kernel2d[i, j] = (double)KassWitkin.ApplyFilterOnOneCoord(i, j, Dh, Dv, CenterX, CenterY, Theta, N);
                }
            }

            return kernel2d;
        }

        public Complex [,] ApplyFilter(Complex [,] input)
        {
            int width = input.GetLength(0);
            int height = input.GetLength(1);

            double[,] kernel = GetKernel(width, height);

            Complex[,] output = new Complex[width, height];

            for (int i = 0; i < width; i++ )
            {
                for (int j = 0; j < height; j++)
                {
                    output[i,j] = input[i,j] * kernel[i,j]; 
                }
            }
            
            return output;
        }
    }

0 Ответов