/// <summary> /// Получает спектр изображения в виде изображения. /// </summary> /// <param name="source">The source.</param> /// <returns></returns> public static Image GetSpectrum(this Image source) { Complex[,] fBlue = Fourier.Transform(Converter.ToComplexMatrix(source.OnlyBlue())); Complex[,] fGreen = Fourier.Transform(Converter.ToComplexMatrix(source.OnlyGreen())); Complex[,] fRed = Fourier.Transform(Converter.ToComplexMatrix(source.OnlyRed())); return(Converter.ToImage(fRed, fGreen, fBlue)); }
/// <summary> /// Перевод оператора искажения из пространственной в частотную область. Размерность не меняется. /// </summary> /// <param name="filter">Оператор искажения PSF (Point Spread Function)</param> /// <returns>OTF (Optical Transfer Function)</returns> public static Complex[,] Psf2otf(ConvolutionFilter filter) { double[,] filterMatrix = filter.normalizedFilterMatrix; int FilterSize = filterMatrix.GetLength(0); int halfSize = (FilterSize - 1) / 2; int ost = FilterSize - halfSize; double[,] newFilter = new double[FilterSize, FilterSize]; //+ + - //+ + - //- - - for (int i = 0; i < ost; i++) { for (int j = 0; j < ost; j++) { newFilter[i, j] = filterMatrix[i + halfSize, j + halfSize]; } } //- - + //- - + //- - - for (int i = 0; i < ost; i++) { for (int j = ost; j < FilterSize; j++) { newFilter[i, j] = filterMatrix[i + halfSize, j - ost]; } } //- - - //- - - //+ + - for (int i = ost; i < FilterSize; i++) { for (int j = 0; j < ost; j++) { newFilter[i, j] = filterMatrix[i - ost, j + halfSize]; } } //- - - //- - - //- - + for (int i = ost; i < FilterSize; i++) { for (int j = ost; j < FilterSize; j++) { newFilter[i, j] = filterMatrix[i - ost, j - ost]; } } return(Fourier.Transform(Converter.ToComplexMatrix(newFilter))); }
/// <summary> /// Двумерное прямое преобразование фурье /// </summary> /// <param name="source">входная матрица</param> /// <returns>Выходной ряд</returns> public static Complex[,] Transform(Complex[,] source) { int M = source.GetLength(0); //строк int N = source.GetLength(1); //столбцов Complex[,] outC = new Complex[M, N]; //преобразуем строки for (int i = 0; i < M; i++) //проходим по строкам { Complex[] str = new Complex[N]; for (int j = 0; j < N; j++) //проходим внутри строки, собирая её { str[j] = source[i, j]; } str = Fourier.Transform(str); //получаем фурье образ строки for (int j = 0; j < N; j++) //записываем его в массив { outC[i, j] = str[j]; } } //преобразуем столбцы for (int i = 0; i < N; i++) //проходим по столбцам { Complex[] raw = new Complex[M]; for (int j = 0; j < M; j++) //проходим внутри столбца, собирая его { raw[j] = outC[j, i]; } raw = Fourier.Transform(raw); //получаем фурье образ столбца for (int j = 0; j < M; j++) //записываем его в массив { outC[j, i] = raw[j]; } } return(outC); }
/// <summary> /// Перевод оператора искажения из пространственной в частотную область с новой (бОльшей) размерностью. /// </summary> /// <param name="filter">оператор искажения исходного размера</param> /// <param name="newSize">новая размерность</param> /// <returns></returns> public static Complex[,] Psf2otf(ConvolutionFilter filter, int newSize) { double[,] filterMatrix = filter.normalizedFilterMatrix; int sourceFilterSize = filterMatrix.GetLength(0); int halfSize = (filter.filterMatrix.GetLength(0) - 1) / 2; if (newSize < sourceFilterSize) { return(null); } double[,] extendedFilter = new double[newSize, newSize]; //0 0 0 //0 0 0 //0 0 0 for (int i = 0; i < newSize; i++) { for (int j = 0; j < newSize; j++) { extendedFilter[i, j] = 0; } } //- - - //- + + //- + + for (int i = 0; i < halfSize + 1; i++) { for (int j = 0; j < halfSize + 1; j++) { extendedFilter[i, j] = filterMatrix[i + halfSize, j + halfSize]; } } //- - - //+ - - //+ - - for (int i = 0; i < halfSize + 1; i++) { for (int j = newSize - halfSize; j < newSize; j++) { extendedFilter[i, j] = filterMatrix[i + halfSize, j - (newSize - halfSize)]; } } //- + + //- - - //- - - for (int i = newSize - halfSize; i < newSize; i++) { for (int j = 0; j < halfSize + 1; j++) { extendedFilter[i, j] = filterMatrix[i - (newSize - halfSize), j + halfSize]; } } //+ - - //- - - //- - - for (int i = newSize - halfSize; i < newSize; i++) { for (int j = newSize - halfSize; j < newSize; j++) { extendedFilter[i, j] = filterMatrix[i - (newSize - halfSize), j - (newSize - halfSize)]; } } return(Fourier.Transform(Converter.ToComplexMatrix(extendedFilter))); }