1 频域滤波
1.1 介绍
-
任何连续周期信号可以由一组适当的正弦曲线组合而成。
-
为什么我们要用正弦曲线来代替原来的曲线呢?
分解信号的目的是为了更加简单地处理原来的信号。而且,用正余弦来表示原信号会更加简单,因为正余弦拥有原信号所不具有的性质:正弦曲线保真度,即一个正弦曲线信号输入后,输出的仍是正弦曲线,只有幅度和相位可能发生变化,但是频率和波的形状仍是一样的。只有正弦曲线才拥有这样的性质,正因如此我们才不用方波或三角波来表示。 -
傅里叶变换将原来难以处理的时域信号转换成了易于分析的频域信号(信号的频谱),可以利用一些工具对这些频域信号进行处理、加工。最后还可以利用傅立叶逆变换将这些频域信号转换成变换后的时域信号。
-
频域滤波的基本步骤如下:
-
代码:
F = fft2(I)
,获得图像的傅里叶变换;Fc = fftshift(F)
,将变换的原点移动到频率矩形的中心;I = ifft2(F)
,计算傅里叶逆变换,通常需要加上real(ifft2(F))
来提取实部。 -
示例:
I = uint8(zeros(500)); I(140:160, 140:160) = 255; subplot(2,2,1), imshow(I), title('原图'); F = fft2(I); subplot(2,2,2), imshow(abs(F), []), title('傅里叶频谱'); Fc = fftshift(F); subplot(2,2,3), imshow(abs(Fc), []), title('移动变换原点'); subplot(2,2,4), imshow(log(1+abs(Fc)), []), title('增强显示');
1.2 低通滤波
-
低通滤波让低频信号能正常通过,而超过设定临界值的高频信号则被阻隔、减弱。例如,边缘部分就是高频信号的位置。
-
示例:
I = imread('test.jpg'); I = rgb2gray(I); subplot(2,2,1), imshow(I), title('原图'); PQ = paddedsize(size(I)); [U, V] = dftuv(PQ(1), PQ(2)); D0 = 0.05*PQ(2); F = fft2(I, PQ(1), PQ(2)); H = exp(-(U.^2 + V.^2) / (2 * (D0^2))); g = dftfilt(I, H); subplot(2,2,2), imshow(fftshift(H)), title('高斯低通滤波器'); subplot(2,2,3), imshow(log(1 + abs(fftshift(F))), []), title('图像频谱增强显示'); subplot(2,2,4), imshow(g, []), title('低通滤波结果'); function PQ = paddedsize(AB, CD) % 计算填充尺寸以供基于FFT的滤波器 if nargin == 1 PQ = 2 * AB; elseif nargin == 2 && ~ischar(CD) PQ = AB + CD -1; PQ = 2 * ceil(PQ / 2); % ceil(N)返回比N大的最小整数,为了避免出现奇数,因为处理偶数数组快 elseif nargin == 2 m = max(AB); P = 2 ^ nextpow2(2 * m); % nextpow2(N)返回第一个P,使得2. ^ P> = abs(N)。 % 对于FFT运算,找到最接近两个序列长度的2 的幂次方通常很有用。 PQ = [P, P]; elseif nargin == 3 m = max([AB CD]); P = 2 ^ nextpow2(2 * m); PQ = [P, P]; else error('Wrong number of input') end end function [U, V] = dftuv(M, N) % 用来计算到中心的距离 u = 0:(M - 1); v = 0:(N - 1); idx = find(u > M / 2); u(idx) = u(idx) - M; idy = find(v > N / 2); v(idy) = v(idy) - N; [V, U] = meshgrid(v, u); end function g = dftfilt(f, H) % 频域滤波函数 F = fft2(f, size(H, 1), size(H, 2)); g = real(ifft2(H .* F)); g = g(1:size(f, 1), 1:size(f, 2)); end
- 可以看出图像的边缘被平滑了,并且图像周围边界部分多了一圈黑边,是因为之前进行了0填充。
1.3 高通滤波
- 高通滤波让高频信号能正常通过,而低于设定临界值的低频信号则被阻隔、减弱,是低通滤波的对立,是图像锐化的一种方式。
- 示例:
I = imread('test.jpg'); I = rgb2gray(I); subplot(2,2,1), imshow(I), title('原图'); PQ = paddedsize(size(I)); [U, V] = dftuv(PQ(1), PQ(2)); D0 = 0.05*PQ(2); F = fft2(I, PQ(1), PQ(2)); H = exp(-(U.^2 + V.^2) / (2 * (D0^2))); Hp = 1 - H; g = dftfilt(I, Hp); subplot(2,2,2), imshow(fftshift(H)), title('高斯高通滤波器'); subplot(2,2,3), imshow(log(1 + abs(fftshift(F))), []), title('图像频谱增强显示'); subplot(2,2,4), imshow(g, []), title('高通滤波结果'); Fg = fft2(g, PQ(1), PQ(2)); figure, subplot(1,2,1), imshow(log(1 + abs(fftshift(F))), []), title('变换前图像频谱'); subplot(1,2,2), imshow(log(1 + abs(fftshift(Fg))), []), title('变换后图像频谱');
- 可以看出边缘被锐化了。