关于matlab图像滤波详解(二维傅里叶滤波)
作者:袁德波 发布时间:2022-04-16 19:51:35
标签:matlab,图像滤波,二维傅里叶,滤波
matlab图像滤波详解(二维傅里叶滤波)
在matlab中,图像滤波有很多中
比如平滑滤波(smooth()函数)
中值滤波medfilt2()函数)
这些相对简单,可以直接参考函数解释,不做详细解说
这里重点讲解一下傅里叶滤波,在matlab中,常用的为快速傅里叶变换。进行滤波的难点就在于如何将图像转换到频率域以及如何将频率域的图像逆变换为空间域中的图像
第一步:读取图像并对图像进行傅里叶变换
Path='images.jpg';
im=imread(Path);
img=rgb2gray(im);%将彩色图变成二维灰度图图像
img2=double(img);%将数据改成double类型,方便进行数据变换
subplot(131)
imshow(img);
title('原始图像')
f=fft2(img2);
此时,f为图像的二维频谱,但是此时的零频分量并不在中间,如果直接进行显示的话,会出现如下结果(见左图),matlab提供ffishift()函数,可以将图像零频分量移到中间
代码见下:
subplot(121)
imshow(log(abs(f)+1),[]);%直接显示图像,未移动零频分量
title('未移动零频分量频谱图')
subplot(122)
f2=fftshift(f);
imshow(log(abs(f2)+1),[]);%直接显示图像,未移动零频分量
title('移动零频分量频谱图')
这里有人肯定会疑问 log(abs(f)+1)中为什么要+1,不加也行,就是为了画图的时候,让f为零 log(abs(f)+1),不加1的话 log(abs(f))会很大,图像不好看
结果如下
第二步:滤波
滤波分为低通、高通、带通、带阻、高斯低通、高低高通滤波,其本质就是令频谱F乘以滤波器H,针对不同的滤波器,H不同
低通滤波器【D(u,v)表示点(u,v)到中心的距离】
在此我们以高斯低通滤波器为例,利用matlab设计滤波器(设D0为10)
D0=10;
[M,N]=size(f2);
m=floor(M/2);
n=floor(N/2);%(n,m)为中心点
for i=1:M
for j=1:N
D=sqrt((i-m)^2+(j-n)^2);
H(i,j)=exp(-1/2*D^2/D0^2);
end
end
figure
subplot(121)
imshow(H);
title('高斯低通滤波器')
滤波器与频谱相乘,即得到滤波后的频谱
subplot(122)
f3=f2.*H;
imshow(log(abs(f3)+1),[])
title('滤波后的频谱')
结果如下
第三步:傅里叶逆变换
进行逆变换时,要先将频谱移动回原位置,即通过ifftshift( )函数实现,代码如下
img3 = (ifft2(ifftshift(f3)));
img4 = uint8(real(img3));%real函数表示留下复数的实部
figure
subplot(121)
imshow(img);
title('原图');
subplot(122)
imshow(img4);
title('逆变换');
结果如下
这里要注意的是逆变换后的img3为复数,要删除虚数部分,并转换成uint8图像格式数据才能用imshow显示
来源:https://blog.csdn.net/yuanhoushu/article/details/123893083


猜你喜欢
- 内容摘要:图片随机显示是一个应用非常广泛的技巧。比如随机banner的显示,当你进入一个网站时它的banner总是不同的,或者总有内容不同的
- 我们将会看到一些在Python中使用线程的实例和如何避免线程之间的竞争。你应当将下边的例子运行多次,以便可以注意到线程是不可预测的和线程每次
- 这篇文章主要介绍了python识别html主要文本框过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 队列queue 多应用在多线程应用中,多线程访问共享变量。对于多线程而言,访问共享变量时,队列queue是线程安全的。从queue队列的具体
- 查了查《VBSCRIPT 速查手册》InstrRev的用法:InstrRev函数,功能:返回某字符串在另一个字符串中出现的从结尾计起的位置语
- 一、安装首先我们需要安装下pyecharts,通过pip指令直接安装即可。pip install pyecharts安装完成后, 可通过pi
- 我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中。特殊食物:1.绿色:普通,
- 本文实例讲述了python异常处理、自定义异常、断言原理与用法。分享给大家供大家参考,具体如下:什么是异常:当程序遭遇某些非正常问题的时候就
- 本文介绍了python技能之导出excel的实例代码,正好能用到,写出来分享给大家作为一个数据分析师,下面的需求是经常会遇到的。从数据库或者
- Python配对函数zip()1、zip将列表、元组或其他序列的元素进行配对新建成一个元组构成的列表,它生成列表长度由最短的序列决定:#zi
- 在数据库查询的时候,我们有时有这样的需求,就是要找出数据表里指定范围行内的数据记录,比如说要找出数据表里第10行到第20行的这10条数据,那
- 原因大致是主键必须是唯一的,也就是数据库里可能存在和现还原数据库有重复的地方,a restriction that Foreign Keys
- 首先我们看看数组的分类: 从数组的下标分为索引数组、关联数组 /* 索引数组,即通常情况下所说的数组 */ var ary1 = [1,3,
- <SCRIPT language="javascript"> function&nbs
- 本文实例为大家分享了python绘制箱型图的具体代码,供大家参考,具体内容如下import numpy as npimport pandas
- 看代码吧~import numpy as npa = np.array([[2, 4, 6, 1], [1, 5, 2, 9]])print
- 前言以前写过 vue项目中封装echarts的比较优雅的方式,大屏可视化里面,除了数据图表很常用,显示省市地图区域也是很常用到的,这是姐妹篇
- Python需要使用标识符给变量命名,其实标识符就是用于给程序中变量、类、方法命名的符号(简单来说,标识符就是合法的名称标识符需要以字母或下
- js判断undefined类型if (reValue== undefined){alert("undefined");}
- 网上资料结合自己的操作整理出的一套靠谱的彻底卸载Oracle 11g的步骤!(Win7),具体内容详情如下所示:1:停掉所有Oracle相关