Как построить 2D БПФ в Matlab?

36

Я использую fft2 для вычисления преобразования Фурье изображения в градациях серого в MATLAB.

Каков общий способ построения величины результата?

Теги:
image-processing
plot
fft

2 ответа

53
Лучший ответ

Предполагая, что I - ваше входное изображение, а F - его преобразование Фурье (т.е. F = fft2(I))

Вы можете использовать этот код:

F = fftshift(F); % Center FFT

F = abs(F); % Get the magnitude
F = log(F+1); % Use log, for perceptual scaling, and +1 since log(0) is undefined
F = mat2gray(F); % Use mat2gray to scale the image between 0 and 1

imshow(F,[]); % Display the result
  • 7
    +1. Вы можете добавить комментарий о том, почему вы используете журнал (F + 1), а не журнал (F) - (из-за неопределенного значения log (0))
  • 0
    @ Андерри Спасибо, готово.
24

Вот пример из моей страницы "КАК" Matlab:

close all; clear all;

img   = imread('lena.tif','tif');
imagesc(img)
img   = fftshift(img(:,:,2));
F     = fft2(img);

figure;

imagesc(100*log(1+abs(fftshift(F)))); colormap(gray); 
title('magnitude spectrum');

figure;
imagesc(angle(F));  colormap(gray);
title('phase spectrum');

Это дает спектр амплитуд и фазовый спектр изображения. Я использовал цветное изображение, но вы можете легко настроить его, чтобы использовать серое изображение.

пс. Я только заметил, что на Matlab 2012a вышеупомянутое изображение больше не включено. Итак, просто замените первую строку выше, скажем

img = imread('ngc6543a.jpg');

и он будет работать. Я использовал более старую версию Matlab, чтобы сделать приведенный выше пример, и просто скопировал его здесь.

О коэффициенте масштабирования

При построении двумерной величины преобразования Фурье нам необходимо масштабировать значения пикселей, используя логарифм преобразования, чтобы расширить диапазон темных пикселей в яркую область, чтобы мы могли лучше видеть преобразование. Мы используем значение c в уравнении

s = c log(1+r) 

Нет известного способа заранее определить этот масштаб, который я знаю. Просто нужно попробуйте разные значения, чтобы понравиться вам. Я использовал 100 в приведенном выше примере.

Изображение 6352

  • 0
    если вы используете imagesc (без установки c-пределов), то значение для константы c, которую вы используете, не имеет смысла
  • 4
    Вы применяете fftshift в пространственной и частотной областях. Тот . , , не может быть прав, нет?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню