令f(x, y)
表示一幅大小为M * N
的图像,其中x = 0, 1, 2, ···, M -1, y = 0, 1, 2, ···, N - 1
。
F(u, v)
,如下:u = 0, 1, 2, ···, M -1, v = 0, 1, 2, ···, N - 1
。频域系统时由F(u, v
所张成的坐标系,其中u、v
用做(频率)变量,由u = 0, 1, 2, ···, M -1, v = 0, 1, 2, ···, N - 1
定义的M * N
矩阵区域称为频率矩形。x = 0, 1, 2, ···, M -1, y = 0, 1, 2, ···, N - 1
,F(u, v)
的值有时称为傅里叶系数。F(u, v)
的幅度)定义为:R(u, v)
和I(u, v)
分别表示F(u, v)
的实部和虚部。R(u, v)
和I(u, v)
分别表示F(u, v)
的实部和虚部。F(u, v)
又可以用复数的极坐标表示为f(x, y)
是实数,则其傅里叶变换关于原点共轭对称,即F(u, v) = F*(-u, -v)
|F(u, v)| = |F(-u, -v)|
F(u, v)
的等式中可得F(u, v) = F(u + M, v) = F(u, v + N) = F(u + M, v + N)
f(x, y) = f(x + M, y) = f(x, y + N) = f(x + M, y + N)
fft2函数
一个大小为M* N的图像数组f可以通过工具箱中的函数fft2
得到,简单语法为:
F = fft2(f)
该函数返回一个大小为M * N的傅里叶变换。
使用傅里叶变换进行滤波时,需要对输入数据进行零填充,此时有:
F = fft2(f, P, Q)
将所要求的0的个数对输入图像进行填充,以便结果函数的大小为P * Q。
abs函数
求傅里叶频谱,其语法为:
S = abs(F)
该函数计算数组的每一个元素的幅度(实部和虚部平方和的平方根)。
fftshift函数
将变换的原点移动到频率矩形的中心,其语法为:
Fc = fftshift(F)
其中,F是用fft2
计算得到的变换,Fc是已居中的变换。函数fftshift
通过变换F的象限来操作,变换计算后使用fftshift
的结果与在计算变换之前将输入图像乘以(-1)x+y所得到的结果相同。注意这两种方法不能互换顺序。
ifftshift函数
用于颠倒这种居中,语法为:
F = ifftshift(Fc)
该函数也可以用于将最初位于矩形中心的函数变换为中心位于矩形左上角的函数。
floor函数
为了准确得到频率矩形的中心点位置,使用函数floor
,且原点位于(1, 1)
处,则MATLAB计算的频率矩形的中心点位于
[floor(M / 2) + 1, floor(N / 2) + 1]
此时,不管M和N是奇数还是偶数,计算结果总是准确的。
ifft函数
傅里叶逆变换函数,基本语法是:
f = ifft2(F)
其中, F是傅里叶变换,f是结果图像。由于浮点计算的舍入误差导致ifft2的输出实际上会有很小的虚数分量,所以最好在计算逆变换后提取结果的实部,以便获得仅由实数值组成的图像,语法为:
f = real(ifft2(F));
Tips:如果得到的频谱中值的动态范围与8比特显示(即中心处的明亮值占支配地位)相比要大得多,我们可以使用对数变换来处理,如得到频谱
此时对其做对数变换得到
S2 = log(1 + abs(Fc));
*
表示两个函数的卷积,双箭头两边的表达式组成了傅里叶变换对。f(x, y)
与滤波掩模h(x, y)
组成,根据卷积定理,我们可以在频域中通过F(u, v) * H(u, v)
得到,通常把H(u, v)
称为滤波传递函数。f(x, y)
和h(x, y)
的大小分别是A * B 和 C * D 。通过对f
和g
补零,我们构造两个大小均为P * Q的扩充的函数,可以看出,通过选择P ≥ A + C -1
Q ≥ B + D -1
F = fft2(f, PQ(1), PQ(2));
PQ(1) * PQ(2)
,然后计算FFT,注意,在频域中使用填充时,滤波器的大小必须为PQ(1) * PQ(2)
。若f是待滤波处理的图像,g为处理结果,同时假设滤波函数H(u, v)大小与填充后的图像的大小相等。
paddedsize(size(f))
获得填充参数PQ = padedsize(size(f));
F = fft2(f, PQ(1), PQ(2));
H = ifftshift(H);
:G = H .* F
g = real(ifft2(G));
g = g(1 : size(f, 1), 1 : size(f, 2));
应用举例
clc
% 从空间滤波器获得频域滤波器
% FFT 傅里叶变换得到频谱
f = imread('6.png');
f = rgb2gray(f);
F = fft2(f);
S = fftshift(log(1 + abs(F)));
S = gscale(S);
figure('name', 'S'), imshow(S)
% filter 空间域的滤波器
h = fspecial('sobel')';
% figure('name', 'freqz2(h)'), freqz2(h)
% 转化为频域滤波器
PQ = paddedsize(size(f)); % 填充0之后的尺寸
H = freqz2(h, PQ(1), PQ(2)); % 频域滤波器
H1 = ifftshift(H); % dftfilt的频域滤波器是非中心化的,进行转换
% figure('name', 'abs(H)'), imshow(abs(H), [])
% figure('name', 'abs(H1)'), imshow(abs(H1), [])
% 空域滤波
gs = imfilter(double(f), h);
figure, imshow(abs(gs), [])
% 频域滤波
gf = dftfilt(f, H1);
figure, imshow(abs(gf), [])
figure, imshow(gf, [])
% creating the binary image to see the margin clearly
% 创建二值图像可以更清晰的看到边缘
figure, imshow(abs(gs) > 0.2 * abs(max(gs(:))))
figure, imshow(abs(gf) > 0.2 * abs(max(gf(:))))
主要关注对称滤波器,即那些指定为至变换的原点的距离的各种函数的滤波器,下面我们将实现几个著名的平滑滤波器,然后介绍如何用MATLAB的线框图和表面图来可视化滤波器。
函数的核心是需要在频率矩形中计算任意点到指定点的距离函数。在MATLAB中,由于FFT的计算假设变换的原点在频率矩形的左上角,所以我们的距离计算也要用到那个点。
dftuv
生成的网络数组已满足使用fft2
的ifft2
的处理的需要,因而无须重排数据。理想低通滤波器(ILPF)具有传递函数:
其中,D0为指定的非负数,D(u,v)
为点(u,v)
到滤波器中心的距离。D(u,v) = D0的点的轨迹为一个圆。注意,若滤波器H乘以一幅图像的傅里叶变换,则我们会发现理想低通滤波器切断了圆外F的所有分量,而圆上和院内的点不变。
H(u,v)
会降低为最大值的某个给定比例,当D(u, v) = D0
时,H(u, v) = 0.5
降为其最大值1的50%。σ
为标准差,令σ = D0
,我们可以根据截止参数D0得到表达式D(u ,v) = D0
时,滤波器由最大值1降为0.607.mesh函数绘制线框图
语法为:mesh(H)
该函数绘制一个x = 1 : M, y = 1 : N
的线框图,其中[M, N] = size(H)
。若M和N很大,则线框图的密码会大到不可接受,在这种情况下,我们可以使用语法:
mesh(H(1 : k : end, 1 : k : end))
来绘制第k个点。经验表明,沿每个轴40~60
个细分可在外观和分辨率之间提供较好的平衡。
MATLAB默认使用彩色绘制网线,命令
colormap([ 0 0 0])
可将线框设置为黑色。
grid on / off
添加或关闭网格
axis on / off
添加或关闭坐标轴
view(az, el)
观察者位置为方向角az
,仰角el
,默认az = -37.5, e; = 30
[az, el] = view
得到当前视图的几何结构
view(3)
将查看点设置为默认值
surf函数绘制表面图
语法为:surf(H)
除了网格中的四边形用彩色填充(称为小面描影)外,该函数产生的图形与函数mesh产生的图形相同。
colormap(gray)
将彩色转换为灰色
axis\grai\view
与前面mesh函数用法相同
shading interp
进行插值,可平滑小面描影并删除网格线
meshgrid函数
若目标是绘制两个变量的解析函数,则可以使用函数meshgrid函数产生坐标值,并由这些坐标值产生在mesh或surf中使用的离散矩阵。
例:绘制函数f(x, y) = x * exp(-x^2 - y^2)
[Y, X] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = X .* exp(-X .^ 2 - Y .^ 2);
mesh(Z) % Or surf(Z)
高通滤波通过削弱傅里叶变换的低频而保持高频相对不变,会使得图像变得更加清晰(锐化)。
Hlp(u, v)
,通过以下语句得到高通滤波器的传递函数:Hhp(u, v) = 1 - Hlp(u, v)
lpfilter
稍加改进就可以得到hpfilter
==Hhfe(u, v) = a + b Hhp(u, v)
亮度变换常用于亮度缩放,空间域滤波广泛用于图像复原、彩色处理、图像分割和图像描绘子提取。