@daniil14056

Как сделать преобразование фурье для изображения по xy?

Вот для изображение из 4 пикселей
c1 c2
c3 c4
Что надо делать.?
Не понимаю, с чего начать. Чем входные данные являются. Вот 4 пикслеля, куда они пойдут в массивах x[] y[] ?
Чем будут инициированы эти массивы для 1 вызова на 0 ряду?
x{0,0} или x{0,1}, или y{c1,c2}
а y{0,0} или y{0,1}, или y{c3,c4}
Что означает двумерное?
public Func<double,double?> CreateFFTFunc(double[] x, double[]y)
        {
            double N = x.Length;
            double[] real=new double[(int)N];
            double[] im=new double[(int)N];
            double phi = 2.0 * Math.PI / N;
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < N; j++)
                {
                    real[i] += y[j]*Math.Cos(phi * i * x[i]);
                    im[i] +=   y[j]*Math.Sin(phi * i * x[i]);
                }
               // real[i] /= N;
               // im[i] /= N;
            }
             
            return (double t) =>
            {
               t = t / N;
                double sRe = 0;
                double sIm = 0;
                for (int j = 0; j < N; j++)
                {
                    sRe += Math.Cos(j *phi*е) * real[j];
                    sIm +=   Math.Sin(j* phi*t) * im[j];
                }
                return new Complex(sRe, sIm);
            }; 
}
  • Вопрос задан
  • 126 просмотров
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Что надо делать.?
Не понимаю, с чего начать.

Вообще если у тебя так много непоняток - то начни не с изображений а с 1-мерного графика.
Курс валют например. Или ход температуры за сезон. Разберешся - дальше пойдешь.
А если ты сейчас даже какую-то фигню закодишь
- то как ты проверишь что правильное преобразование сделал?

Начни с контракта. Что приходит тебе на вход? Вот это вот
double[] x, double[]y

С моей точки зрения - тут должна быть картинка. Image. На следующем уровне ты ее разбиваешь
на цветовые слои. Красный зеленый ит.д. Потом эти слои разбиваешь на фреймы (8х8 пикс как в jpg).
Потом их нормируешь от цвета пиксела до вещественного значения. И вот уже когда ты получишь
матрицу вещественных значений - тогда и можно приступать к Фурье. Усек? У тебя хедер
функции должен иметь такие параметры чтобы тебе было все кристально ясно что за аргументы и как.

А так конешно у тебя каша в голове.

Да. И по контракту Фурье преобразования ты получаешь комплесную
вещественную матрицу на выходе. Тоесть две матрицы. Размер их не обязательно должен быть 8х8.
Он может быть любым. Но обычно нижние коэффициенты матрицы (левый верхний угол - самые
ценные для Фурье формулы).

И дальше - делаешь все в обратном направлении. От Фурье к картинке. Получиться картинка - молодец.
Значит правильно сделал.
Ответ написан
wataru
@wataru Куратор тега Математика
Разработчик на С++, экс-олимпиадник.
Двумерное преобразование фурье обычно делается так: отдельно каждую строку одномерным перобразованием фурье, потом на вот этой новой матрице - отдельно каждый столбец. Обратное преобразование в обратном порядке: cначала каждый столбец, потом каждую строку (хотя можно и в другом порядке, просто так концептуально понятнее, почему оно работает).

Если у вас всего 4 пикселя, то возможно x и y - это будут 2 строки входной матрицы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы