Esempio n. 1
0
        /// <summary>
        /// Перевод оператора искажения из частотной в пространственную область. Размерность не меняется.
        /// </summary>
        /// <param name="otf">оператор искажения в частотной области (OTF - Optical Transfer Function)</param>
        /// <returns>PSF - Point Spread Function</returns>
        public static ConvolutionFilter Otf2psf(Complex[,] otf)
        {
            Complex[,] psf = Fourier.ITransform(otf);
            int FilterSize = psf.GetLength(0);
            int halfSize   = (FilterSize - 1) / 2;
            int ost        = FilterSize - halfSize;

            Complex[,] returnPSF = new Complex[FilterSize, FilterSize];
            //+ - -
            //- - -
            //- - -
            for (int i = 0; i < halfSize; i++)
            {
                for (int j = 0; j < halfSize; j++)
                {
                    returnPSF[i, j] = psf[i + ost, j + ost];
                }
            }
            //- + +
            //- - -
            //- - -
            for (int i = 0; i < halfSize; i++)
            {
                for (int j = halfSize; j < FilterSize; j++)
                {
                    returnPSF[i, j] = psf[i + ost, j - halfSize];
                }
            }
            //- - -
            //+ - -
            //+ - -
            for (int i = halfSize; i < FilterSize; i++)
            {
                for (int j = 0; j < halfSize; j++)
                {
                    returnPSF[i, j] = psf[i - halfSize, j + ost];
                }
            }
            //- - -
            //- + +
            //- + +
            for (int i = halfSize; i < FilterSize; i++)
            {
                for (int j = halfSize; j < FilterSize; j++)
                {
                    returnPSF[i, j] = psf[i - halfSize, j - halfSize];
                }
            }

            ConvolutionFilter cf = new ConvolutionFilter("Recovery Fiter", Converter.ToDoubleMatrix(returnPSF));

            return(cf);
        }
Esempio n. 2
0
        /// <summary>
        /// Двумерное обратное преобразование фурье
        /// </summary>
        /// <param name="source">входная матрица</param>
        /// <returns>Выходной ряд</returns>
        public static Complex[,] ITransform(Complex[,] source)
        {
            int M = source.GetLength(0);    //строк
            int N = source.GetLength(1);    //столбцов

            Complex[,] outC = new Complex[M, N];

            //преобразуем столбцы
            for (int i = 0; i < N; i++) //проходим по столбцам
            {
                Complex[] raw = new Complex[M];
                for (int j = 0; j < M; j++) //проходим внутри столбца, собирая его
                {
                    raw[j] = source[j, i];
                }
                raw = Fourier.ITransform(raw); //получаем фурье образ столбца
                for (int j = 0; j < M; j++)    //записываем его в массив
                {
                    outC[j, i] = raw[j];
                }
            }

            //преобразуем строки
            for (int i = 0; i < M; i++) //проходим по строкам
            {
                Complex[] str = new Complex[N];
                for (int j = 0; j < N; j++) //проходим внутри строки, собирая её
                {
                    str[j] = outC[i, j];
                }
                str = Fourier.ITransform(str); //получаем фурье образ строки
                for (int j = 0; j < N; j++)    //записываем его в массив
                {
                    outC[i, j] = str[j];
                }
            }

            return(outC);
        }