Matlab之频域滤波(十五)

Tricia ·
更新时间:2024-09-21
· 876 次阅读

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

这部分是补充内容,具体可以结合这篇博客来学习一下
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); %逆变换回空域再显示图像

故我们频域中的操作一般都是逆变换之前进行所需要的操作即可。

目录频域滤波器建立网格数组低通滤波器绘制线框图和表面图线框图meshcolormap表面图高通滤波器 频域滤波器 建立网格数组 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减去低通就可得到,所以原理也很简单呢!只是补充了一些小东西


作者:我要糖



频域 matlab

需要 登录 后方可回复, 如果你还没有账号请 注册新账号