Реализация БПФ
Я работаю над приложением для улучшения изображения с помощью 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 ответа:
Вы можете использовать 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