一、频率域滤波的基本步骤:

1)使用函数tofloat把输入图像转换为浮点图像(im2double函数也可以)

[f,revertclass] = tofloat(f)

2)使用函数paddedsize获得填充参数

PQ = paddedsize(size(f));

3)得到有填充图像的傅里叶变换

F = fft2(f,PQ(1),PQ(2));

4)生成一个大小为PQ(1)*PQ(2)的滤波器函数,用freqz2函数,如果它是居中的,那么在使用之前要反变换一下(h为空间滤波器)

H = freqz2(h,PQ(1),PQ(2));

H = ifftshift(H);

5)用滤波器乘以该变换,然后进行傅里叶反变换

G = H.*F;

g = ifft2(G);

6)将左上部的矩形修剪为原始大小,然后将图像转换为输入图像的类

g = g(1:size(f,1),1:size(f,2));

g = revertclass(g); %或者 g = im2uint8(g);

可以把这个过程封装成一个M函数,然后用的时候直接调用,函数如下(输入为原图像和滤波器):

%用于频率域滤波的M函数

function g = dftfilt(f,H,classout)

%f = im2double(f); %转化为浮点图像

[f,revertclass] = tofloat(f);

F = fft2(f,size(H,1),size(H,2)); %得到有填充图像的傅里叶变换

g = ifft2(H.*F); %滤波(相乘),傅里叶反变换

g = g(1:size(f,1),1:size(f,2)); %裁剪为原始大小

if nargin ==2||strcmp(classout,'original')

% g = im2uint8(g);

g = revertclass(g);

elseif strcmp(classout,'fltpoint')

return

else

error('undefine class for the output image')

end

二、从空间滤波器获得频率域滤波器

通常,当滤波器较小时,在计算上空间滤波要比频率域滤波更有效率,但是滤波器较大时,使用FFT算法的滤波处理比空间实现快。

将空间滤波器变换为频率域滤波器需要用freqz2函数。比如下面这个例子可以比较空间滤波和频率域滤波(sobel滤波器和其对应的频率域滤波器):

这里构建的滤波器类似于高通滤波器,它在变换的中心位置是0,其他位置为1,当建立乘积H(u,v)*F(u,v)时,该滤波器将抑制F(u,v)的直流项而通过其他所以项。直流项决定图像的平均灰度,因此将其置0会把输出图像的平均灰度减小为0。因此,图像会变得更暗。上溯例子的代码如下:

%空间滤波和频域滤波的比较

f=imread('G:\数字图像处理(冈萨雷斯)\DIP3E_CH04_Original_Images\DIP3E_Original_Images_CH04\Fig0438(a)(bld_600by600).tif');

subplot(231);imshow(f);title('原图')

f = im2double(f);

F = fft2(f);

S = fftshift(log(1 + abs(F))); %取傅里叶谱,然后进行对数变换增强细节,最后将频域中心转移到矩阵中心

subplot(232);imshow(S,[]);title('傅里叶谱');

h = fspecial('sobel')'; %空间域sobel滤波器

PQ = paddedsize(size(f));

H = freqz2(h,PQ(1),PQ(2)); %转换为频域滤波器

H1 = ifftshift(H); %用于重排数据,使得原点位于频率矩形左上角

subplot(233);imshow(abs(H),[]);title('滤波器的图像显示');

subplot(234);imshow(abs(H1),[]);title('反中心化滤波器的图像显示');

subplot(235);freqz2(h); title('频率域滤波器的绝对值的三维透视图'); %freqz2被写成没有输出参量的形式,显示为三维透视图

h1=ifftshift(h);

subplot(236);freqz2(h1);title('反中心化的同一滤波器的三维透视图');

figure; gs = imfilter(f,h); %空间域滤波

subplot(221);imshow(gs,[]);title('空间滤波结果');

gf = dftfilt(f,H1); %频域滤波

subplot(222);imshow(gf,[]);title('频率域滤波');

subplot(223);imshow(abs(gs),[]);title('空间结果的绝对值')

subplot(224);imshow(abs(gf),[]);title('频率滤波结果的绝对值(频谱)')

figure; subplot(121);imshow(abs(gs)>0.2*abs(max(gs(:))));title('阈值处理的结果1'); %阈值处理,只显示比gs、gf的最大值的20%的边缘

subplot(122);imshow(abs(gf)>0.2*abs(max(gf(:)))); title('阈值处理结果2')

三、绘制线框图和表面图

三维线框图和表面图对于观察二维滤波器很有作用,绘制大小为M*N的二维函数H的最简单方法是使用mesh函数,可以每隔k个点进行绘制:

mesh(H(1:k:end,1:k:end))

matlab默认绘出彩色网格图,用colormap([0 0 0])将线框图设置为黑色。默认的还自带网格和坐标轴,使用grid off关闭网格,grid on打开网格,axis on打开坐标轴,axis off关闭坐标轴。还可以设置观察点的位置,view(az,el),az和el分别代表方位角和仰角。用[az,el]=view可以查看当前的几何视图。

有时候需要绘制成表面图而不是线框图,函数surf有这个功能,语法为surf(f);这中跟mash差不多,知识网格中的四边形会被彩色填充(小面描影),用colormap(gray)可以将彩色转换为灰色,用shading interp可以去掉网格线。简单的例子(高斯低通滤波器)如下:

具体代码如下:

%线框图,高斯低通滤波器 图3.15

H = fftshift(lpfilter('gaussian',500,500,50));

mesh(double(H(1:10:500,1:10:500)));

grid off

axis off

%colormap([0 0 0]); %将线框图设置为黑色

figure;

H = fftshift(lpfilter('gaussian',500,500,50));

surf(double(H(1:10:500,1:10:500))); %表面图

grid off %去掉网格

axis off %去掉坐标轴

%colormap(gray) %转换为灰色

shading interp %平滑小面描影并去掉网格线

[x,y] = meshgrid(-2:0.1:2,-2:0.1:2);

z = x.*exp(-x.^2-y.^2); %一个函数的表面图。

figure; surf(z);

grid off

axis off

shading interp

频率域滤波matlab函数,频率域滤波(2) - osc_t0xmr011的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. TF-IDF的Matlab程序,TF-IDF算法简析 - osc_sjg81se7的个人空间 - OSCHINA - 中文开源技术交流社区...

    TF-IDF算法可用来提取文档的关键词,关键词在文本聚类.文本分类.文献检索.自动文摘等方面有着重要应用. 算法原理 TF:Term Frequency,词频 IDF:Inverse Document ...

  2. mysql fnv64函数_FNV哈希算法 - osc_tiaoycd5的个人空间 - OSCHINA - 中文开源技术交流社区...

    FNV哈希算法 [TOC] FNV版本 FNV哈希分为3个版本:fnv-0(已废弃),FNV-1,FNV-1a 算法实现 FNV-0算法公式 hash = 0 for each byte_of_dat ...

  3. matlab求轮廓系数,K-mean算法分析 - osc_b2jf5efr的个人空间 - OSCHINA - 中文开源技术交流社区...

    from sklearn.datasets import load_sample_image from sklearn.cluster import KMeans import matplotlib. ...

  4. java跨域cookie共享_cookie跨域共享 - qijian0503的个人空间 - OSCHINA - 中文开源技术交流社区...

    问题描述 需要解决前端pc跟服务端(java),跨域后都能获取到同一个cookie. 使用二级域名共享cookie有一个限制条件,就是两个域名的二级域名必须相同 前端pc访问域名:a.b.com 后端 ...

  5. matlab提示音,matlab发出声音 - osc_45mm6g1p的个人空间 - OSCHINA - 中文开源技术交流社区...

    我有时候运行一段很长的代码,在等待的时候去做别的事,希望程序运行完可以有一个提示音. 这可以用matlab的一个函数sound实现,该函数的输入参量是音频数据向量.采样频率和转换位数. % 响一声 s ...

  6. 精英主义 遗传算法 matlab,遗传算法优化 - osc_lfs4vsih的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.遗传算法简介 遗传算法是一种基于自然选择和群体遗传机理的搜索算法,它模拟了自然选择和自然遗传过程中的繁殖.杂交和突变现象.再利用遗传算法求解问题时,问题的每一个可能解都被编码成一个"染色 ...

  7. matlab一计算自动四舍五入6,matlab总结 - osc_msmij2gf的个人空间 - OSCHINA - 中文开源技术交流社区...

    MATLAB 总结 一 基础部分 1.save('x','y','z') 保存三个变量 2.load('var') 加载变量 3.help size who dir cd delete clear 4 ...

  8. java有没有回调函数_Java中的回调函数 - wangjianme的个人空间 - OSCHINA - 中文开源技术交流社区...

    Java代码的回调函数经常由框架或是系统定义,由程序开发人员填充. 它的最主要特点是即定义了调用的规范同时又非常的灵活. 回调函数有些类似于观察者模式,它们的区别在于:观察者模式返回的参数为Event ...

  9. c语言处理字符串函数的头文件,C语言字符处理函数 - 20131125的个人空间 - OSCHINA - 中文开源技术交流社区...

    C语言提供了丰富的字符串处理函数, 大致可分为字符串的输入.输出.合并.修改.比较.转换.复制.搜索几类. 使用这些函数可大大减轻编程的负担.用于输入输出的字符串函数,在使用前应包含头文件" ...

最新文章

  1. python3官方最新下载-python3.7
  2. linux io100的原因_Linux学习笔记(九)软件包管理
  3. solr4.2增量索引之同步(修改,删除,新增)--转载
  4. 微信小程序 html modal,微信小程序参考微信设计规范做的modal模态框
  5. SAP Business Application Studio和SAP云平台Destination
  6. Docker解析及轻量级PaaS平台演练(一)--Docker简介与安装
  7. 书屋(一):读《世界是平的》有感
  8. 游戏物体复用:对象池(以Unity3D为例)
  9. 计算机课又叫什么课,计算机课学电脑的书叫什么?
  10. 【语音增强】基于matlab小波变换语音增强【含Matlab源码 296期】
  11. 2019年中总结之说走就走
  12. 2016 中兴签约经验
  13. 解决在Filter中读取Request中的流后,后续controller或restful接口中无法获取流的问题
  14. 微信公众号本地环境搭建(解决微信接口需要公网地址,但是只有本地环境的问题)
  15. 这么多人问的JVM的垃圾回收到底是个啥?
  16. 【项目管理软件盛宴】谁才是人气王?
  17. HTML学习笔记_常用标签的使用及注意事项
  18. 数据库分页数据被业务代码过滤后不足个数问题
  19. 什么是渲染?渲染的来源、分类及应用有哪些?
  20. 2022年全球市场智能纺织品总体规模、主要生产商、主要地区、产品和应用细分研究报告

热门文章

  1. Web前端_项目实践01_萌娃摄影网页(纯HTML+CSS静态页面)
  2. 开源调度框架xxl-job集成SpringBatch详解
  3. Spring注解@Import详细使用说明
  4. vue v-show指令
  5. linux read while 变量运算
  6. VMware虚拟机里面无法直接访问主机磁盘怎么办?
  7. linux centos7完整记录对根目录的磁盘扩容过程(扩容99G)
  8. linux sort排序工具和uniq去重工具使用示例
  9. vue商城项目开发:封装banner组件、组件参数传递
  10. Linux 创建和删除目录命令mkdir、rmdir