傅里叶变换
1、傅里叶变化公式
F(u, v) = symsum(symsum(f(x, y) * exp(- j * 2 * pi * (u * x / M + v * y / N))))
2、根据公式所写代码
这个代码的时间复杂度为 O(n^2), 算一幅 512 * 512 的图像的时间大概是2个小时,没有实际应用价值,应该要采用快速傅里叶变换。
%% 锐化空间滤波器 频率滤波 二维离散傅里叶变换 傅里叶变换的代码自己实现
% 作者:杨宇东
% 日期:2014.09.30
% 参数:imgFile 源图像文件
% 输出:
% fourierResult 进行傅里叶变换之后的结果;
% centeredFourierResult 进行傅里叶变换之后进行中心平移和取对数增强之后的记过
%%
function [fourierResult, centeredFourierResult] = FourierTransformation(imgFile)
im = imread(imgFile);
[nHeight, nWidth, nDim] = size(im);
if nDim == 3
im = rgb2gray(im);
end
subplot(1, 3, 1), imshow(im);
% 进行傅里叶变换
j = sqrt(-1);
M = nHeight;
N = nWidth;
img = zeros(M, N);
for u = 1:nHeight
for v = 1:nWidth
% 直接套用公式 F(u, v) = symsum(symsum(f(x, y) * exp(- j * 2 * pi * (u * x / M + v * y / N))))
sumF = 0;
for x = 0:M-1
for y = 0:N-1
sumF = sumF + double(im(x + 1, y + 1)) * exp(- j * 2 * pi * (u * x / M + v * y / N));
end
end
img(u, v) = sumF;
end
end
fourierResult = log(abs(img));
subplot(1, 3, 2), imshow(fourierResult, []);
% 中心变换和取对数增强
centeredFourierResult = 0.5 * log(1 + abs(fftshift(fourierResult)));
subplot(1, 3, 3), imshow(centeredFourierResult, []);
为了看到是不是达到效果,做了一个 10 * 10 的图像来测试,上图为上述代码的效果,下图为调用系统函数的效果。
3、调用系统函数 FFT2
通过调用 Matlab 的系统函数 FFT2 实现二维的傅里叶变换。
%% 锐化空间滤波器 频率滤波 二维离散傅里叶变换
% 作者:杨宇东
% 日期:2014.09.29
% 参数:imgFile 源图像文件
% 输出:
% fourierResult 进行傅里叶变换之后的结果;
% centeredFourierResult 进行傅里叶变换之后进行中心平移和取对数增强之后的记过
%%
function [fourierResult, centeredFourierResult] = MatlabFourier(imgFile)
im = imread(imgFile);
[nHeight, nWidth, nDim] = size(im);
if nDim == 3
im = rgb2gray(im);
end
subplot(1, 3, 1), imshow(im);
% 进行傅里叶变换
img = fft2(im);
fourierResult = log(abs(img));
subplot(1, 3, 2), imshow(fourierResult, []);
% 中心变换和取对数增强
centeredFourierResult = 0.5 * log(1 + abs(fftshift(fourierResult)));
subplot(1, 3, 3), imshow(centeredFourierResult, []);
4、达到 PPT 中效果版的
达到了像 PPT 中那样的效果的代码
function f = MatlabFFT(imgFile)
im = imread(imgFile);
[nHeight, nWidth, nDim] = size(im);
if nDim == 3
im = rgb2gray(im);
end
% 二维离散傅里叶变换
f = fft2(im);
% 将直流分量移到频谱中心
f = fftshift(f);
% 取傅立叶变换的实部
RRfdp1=real(f);
% 取傅立叶变换的虚部
IIfdp1=imag(f);
% 计算频谱幅值
a=sqrt(RRfdp1.^2+IIfdp1.^2);
% 归一化
f=(a-min(min(a)))/(max(max(a))-min(min(a)))*255;
subplot(1, 2, 1), imshow(im);
subplot(1, 2, 2), imshow(real(f));