基本概念就不概述了,我们都知道要进行滤波有空域和频域两种形式,而频域上的分析实际上就是进行傅里叶变换之后的结果的分析。而实际的图形中傅里叶变换之后所得中心会分布到图像四个角上,故就要进行频谱移中
这部分是补充内容,具体可以结合这篇博客来学习一下
https://blog.csdn.net/qq_44790423/article/details/104740105
整体思路的实现代码为:
%假设原图大小为M×N
F = fft2(f); %傅里叶变换
F = fft2(f, P, Q); %填充零使图像大小为P×Q
F1 = fftshift(F); %频谱移中
f2 = ifftshift(F1); %逆变换回空域再显示图像
故我们频域中的操作一般都是逆变换之前进行所需要的操作即可。
频域滤波器
建立网格数组
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);
[U, V] = dftuv(8,5);
D = U.^2 + V.^2
%计算矩阵中的每个点到原点的距离
可得到如下结果:
D =
0 1 4 4 1
1 2 5 5 2
4 5 8 8 5
9 10 13 13 10
16 17 20 20 17
9 10 13 13 10
4 5 8 8 5
1 2 5 5 2
低通滤波器
f = imread('moon.tif');
[h,w] = size(f);
[U,V] = dftuv(h, w);
D0 = 0.5*w; %取截止频率为图片宽度的0.5
F = fftshift(fft2(f, h, w)); %转换为频域再用fftshift进行平移
H = exp(-(U.^2 + V.^2)/(2*(D0^2)));
G = F.*H; %频域内滤波
g = ifft2(ifftshift(G)); %回到空域
g = g(1: size(f, 1), 1: size(f, 2)); %截取图片出来
figure
subplot(121)
imshow(fftshift(H), []);
subplot(122)
imshow(log(1+abs(F)), []);
figure
subplot(121)
imshow(f)
subplot(122)
imshow(g);
下图为低通滤波器和移中后的频域波形
下图为原图和经低通滤波器的波形(只可以看到图形的大致轮廓)
绘制线框图和表面图
一般使用函数mesh
线框图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个细分可在外观与分辨率之间提供了较好的平衡
colormap
%绘制彩色的线
colormap([0 0 0]) %设为黑色
补充:
grid off %关闭网格
axis off %关闭坐标轴
view(az, e1) %控制观测位置,az为方位角,e1为仰角
举个例子:
f = imread('moon.tif');
[h,w] = size(f)
[U,V] = dftuv(h, w);
D0 = 50; %取截止频率为图片宽度的0.5
F = fftshift(fft2(f, h, w)); %转换为频域再用fftshift进行平移
H = exp(-(U.^2 + V.^2)/(2*(D0^2)));
H = fftshift(H);
subplot(221)
mesh(H(1:10:540, 1:10:466))
axis([0 48 0 50 0 1])
subplot(222)
mesh(H(1:10:540, 1:10:466))
colormap([0 0 1])
subplot(223)
mesh(H(1:10:540, 1:10:466))
grid off
axis off
subplot(224)
mesh(H(1:10:540, 1:10:466))
grid off
axis off
view(-25, 0)
表面图
一般用surf
[Y X] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = X.*exp(-X.^2 - Y.^2);
subplot(121)
mesh(Z)
subplot(122)
surf(Z)
再对图二进行一个操作
subplot(122)
surf(Z)
shading interp
高通滤波器
f = imread('moon.tif');
[h,w] = size(f);
[U,V] = dftuv(h, w);
D0 = 80;
F = fftshift(fft2(f, h, w)); %转换为频域再用fftshift进行平移
H = 1 - exp(-(U.^2 + V.^2)/(2*(D0^2)));
G = F.*H; %频域内滤波
g = ifft2(ifftshift(G)); %回到空域
g = g(1: size(f, 1), 1: size(f, 2)); %截取图片出来
figure
subplot(121)
imshow(fftshift(H), []);
subplot(122)
imshow(log(1+abs(F)), []);
figure
subplot(121)
imshow(f)
subplot(122)
imshow(g);
同低通滤波器一样,只是用1减去低通就可得到,所以原理也很简单呢!只是补充了一些小东西