Ejemplo n.º 1
0
 /// <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));
 }
Ejemplo n.º 2
0
        /// <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)));
        }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
        /// <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)));
        }