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