Matlab之频域滤波(十五)

基本概念就不概述了,我们都知道要进行滤波有空域和频域两种形式,而频域上的分析实际上就是进行傅里叶变换之后的结果的分析。而实际的图形中傅里叶变换之后所得中心会分布到图像四个角上,故就要进行频谱移中

这部分是补充内容,具体可以结合这篇博客来学习一下
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个点
%沿每个轴4060个细分可在外观与分辨率之间提供了较好的平衡
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减去低通就可得到,所以原理也很简单呢!只是补充了一些小东西

发布了96 篇原创文章 · 获赞 224 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44790423/article/details/105535248
今日推荐