Реализация БПФ


Я работаю над приложением для улучшения изображения с помощью FFT.

Я реализовал код для FFT:

Введите описание изображения здесь

Для первой формулы на рисунке выше я реализовал код, как показано ниже:

  void fft(int x , int y , int size) {

    for(int i=x; i<x+32 ; i++){
        for(int j=y ; j<y+32 ; j++){
            double kth = -2 * Math.PI * (((i*x)/size)+((j*y)/size));
            ComplexNumber expo = new ComplexNumber(Math.cos(kth),Math.sin(kth));
            output.values[i][j] = ComplexNumber.cMult(input.values[x][y],expo) ;
            intermediate.values[i][j] = output.values[i][j];
            input.values[i][j] = output.values[i][j];
        }

    }

}

Я также реализовал код для второй и третьей формулы, но результат, который я получаю, не является правильным. Что же мне делать ?

Верен ли код, реализованный для первого уравнения?

Отредактировано

Я пробовал с предложенным функции в рамках Каталано на изображении отпечатка пальца. Входное изображение и выходное изображение после применения структуры Catalano:

Входное Изображение

Введите описание изображения здесь

Преобразование Фурье

Введите описание изображения здесь

Частотный Фильтр

Введите описание изображения здесь

Вывод

Введите описание изображения здесь

Поскольку я применяю его к изображению отпечатка пальца, разница между входным и выходным изображениями не так эффективна.Контраст между хребтами и впадины в изображении отпечатка пальца не ясно различимы даже после применения FFT.So есть ли дополнительные параметры, необходимые для выполнения операции с изображением отпечатка пальца?

2 2
fft

2 ответа:

Вы можете использовать Catalano Framework.

Смотрите код ниже и результаты.

FastBitmap fb = new FastBitmap("c:\\files\\test.bmp");
fb.toGrayscale();
JOptionPane.showMessageDialog(null, fb.toIcon(), "Image", JOptionPane.PLAIN_MESSAGE); 

FourierTransform ft = new FourierTransform(fb);
ft.Forward();
fb = ft.toFastBitmap();
JOptionPane.showMessageDialog(null, fb.toIcon(), "Fourier Transform", JOptionPane.PLAIN_MESSAGE);

FrequencyFilter ff = new FrequencyFilter(0, 60);
ff.ApplyInPlace(ft);
fb = ft.toFastBitmap();
JOptionPane.showMessageDialog(null, fb.toIcon(), "Frequency Filter", JOptionPane.PLAIN_MESSAGE);

ft.Backward();
fb = ft.toFastBitmap();
JOptionPane.showMessageDialog(null, fb.toIcon(), "Result", JOptionPane.PLAIN_MESSAGE);

Исходное изображение

преобразование Фурье

частотный фильтр

Результат

Вы можете использовать FFT в java следующим образом:

Эта связь мертва (http://blog.datasingularity.com/?p=53 )

Http://introcs.cs.princeton.edu/java/97data/FFT.java.html

И обратитесь к информации для FFTW является "самым быстрым преобразованием Фурье на Западе", и имеет некоторые оболочки Java: from http://www.fftw.org/download.html