matlab的傅里叶变换

更多MATLAB图像处理视频请点击  http://study.163.com/course/courseMain.htm?courseId=1003594013   

图像变换:    

更多MATLAB图像处理视频请点击  http://study.163.com/course/courseMain.htm?courseId=1003594013

     在 MATLAB 中,一般用二元函数 f(x, y) 作为图像的数学表示。  f( x, y) 表示在特定点f( x, y) 处的函数值,表示图像在该点相应的颜色强度或者灰度。所谓图像变换就是指把图像转换为另一种数学表示方式的操作。

        在图像处理技术中,图像的正交变换技术有着广泛的应用,是图像处理的重要工具。通过变换图像,改变图像的表示域及表示数据,可以给后继工作带来极大的方便。例如,傅立叶变换可使处理分析在频域中进行,使运算简单;而离散余弦变换(DCT)可使能量集中在少数数据上,从而实现数据压缩,便于图像传输和存储。

         1.傅立叶变换的基本概念

       假设  f (m,n) 是一个包含两个离散空间变量 m 和 n 的函数,则该函数的二维傅立叶变换的定义如下:

                                                            

       式中, ω 1 和 ω 2 为频域变量,其单位为弧度/采样单元。通常函数 F( ω 1 ,  ω 2 )称为函数 f (m, n)的频域表示。F( ω 1 ,  ω 2 )是复变函数,其变量 ω 1 和 ω 2 的周期均为 2π。因为这种周期性的存在,所以通常在图像显示时,这两个变量的取值范围为-pi<=ω 1,ω 2<=pi.

   傅立叶反变换定义如下:

            

        简单地说,该方程说明 f (m, n)可以表示为无限多项不同频率的复指函数之和。而不同的频率点( ω 1 ,  ω 2 )所做的贡献由幅度 F( ω 1 ,  ω 2 )决定。

   

      例如,考察下面的矩形函数 f (m, n)。该函数在一个矩形的区域中的函数值为 1,其他区域都为 0,如图 所示。
      在 MATLAB 中,变量 m、n 和函数 f (m, n)均采用离散表示,所以要想真实地逼近连续函数,只能通过提高取样率。因此,f (m, n)函数的傅立叶变换可由以下程序段获得,傅立叶变换的幅值即|F( ω 1 ,  ω 2 )|,如图 (b)所示。其中 x 轴和 y 轴分别为水平分量和垂直分量

例:  

N=100;
f=zeros(50,50);
f(15:35,23:28)=1;
figure(1);
imshow(f,'InitialMagnification','fit');title('矩形连续函数')
%图片自动适应窗口大小输出

F=fft2(f,N,N);
% F = fft2(f,N,N)是由用户设定变换区域的大小NxN。当然,如果用户设定的区域大小不是 2 的整数次方,FFT 还会有默认的补零操作

F2=fftshift(abs(F));
%fftshift的作用正是让正半轴部分和负半轴部分的图像分别关于各自的中心对称。
%因为直接用fft得出的数据与频率不是对应的,fftshift可以纠正过来

figure(2);
x=1:N;y=1:N;
mesh(x,y,F2(x,y)),title('傅立叶变换幅值');%三维网格图
colormap(gray);%输出灰色系曲面图
colorbar;%添加颜色条





2.离散傅立叶变换

      在用计算机处理傅立叶变换通常采用离散傅立叶变换(Discrete Fourier Transform,DFT)。采用离散傅立叶变换主要有以下两个原因:

    (1)因为 DFT 的输入/输出均为离散值,非常适用于计算机的运算操作。
   (2)采用离散傅立叶变换,就可以用一种快速算法,即快速傅立叶变换(Fast FourierTransform,FFT)。
     FFT 的设计思想是将原函数分为奇数项和偶数项,通过不断将一个奇数项和一个偶数项相加(减),得到需要的结果。

   也就是说 FFT 是将复杂的乘法运算变成两个数相加(减)的简单运算的重复,即通过计算两个单点的 DFT,来计算两个双点的 DFT;通过计算两个双点的 DFT,来计算四个  点的DFT⋯⋯依此类推。

    对于任何 N=2 m 的 DFT 的计算,通过计算两个 N/2 点的 DFT,来计算 N 个点的 DFT。
    数学定义:

   

      在 MATLAB 中,可分别用函数 fft、fft2 和 fftn 来计算一维、二维和 n 维的 FFT,而其反变换依次为 ifft、ifft2 和 ifftn。

例:

 f = zeros(30,30);
f(5:24,13:17) = 1;
imshow(f,'InitialMagnification','fit');title('矩形连续函数');
%图片自动适应窗口大小输出
F = fft2(f);
F2 = log(abs(F));%输出幅度值的另一种方法
figure
imshow(F2,[-1 5],'InitialMagnification','fit'); colormap(jet); colorbar;title('傅里叶变换幅值');
%matlab colormap(jet)中数值大为红色,数值小为蓝色

    在计算离散傅立叶变换时,可以通过下面的语句对被变换函数(或图像区域)进行补零操作来提高分辨率,具体调用方式如下:
    F = fft2(f,M,N);M×N 表示进行补零操作后被变换区域的大小,与原区域不相重叠的区域补零。


3.利用傅立叶变换进行图像特征识别

(1)快速卷积

         傅立叶变换的另一个重要特性是能够实现快速卷积。由线性系统理论可知,两个函数的卷积的傅立叶变换等于两个函数的傅立叶变换的乘积。该特性与快速傅立叶变换一
起,可以快速计算函数的卷积

fft(f1*f2)=fft(f1)x fft(f2)

f1*f2=ifft(fft(f1)xfft(f2));

(2)图像特征识别

     傅立叶变换可以用于与卷积密切相关的相关运算(correlation)。在数字图像处理中的相关运算通常用于匹配模板,可以用于对某些模板对应的特征进行定位。例如,假如我们希望在图像 text.tif 中定位字母“a”,如图所示,可以采用下面的方法定位。

    将包含字母“a”的图像与图像 text.png 进行相关运算,也就是对字母“a”的图像和图像 text.png 进行傅立叶变换,然后利用快速卷积的方法,计算字母“a”和图像 text.png 的卷积,提取卷积运算的峰值,即得到在图像 text.png 中对应字母“a”的定位结果。

例:

bw=imread('text.png');
>> a=bw(32:45,88:98);
>> figure,imshow(bw),title('原图,在这幅图中找出字母a的位置');
>> figure,imshow(a),title('字母a');
>>
>> C = real(ifft2(fft2(bw) .* fft2(rot90(a,2),256,256)));
figure, imshow(C,[]),title('C');
>> max(C(:))

ans =

   68.0000

>> thresh=60;
>> figure,imshow(C>thresh);
>> %卷积运算的值大于60的输出为白色,小于的为黑色,卷积值反映了相似程度,越大表示越相近,当大于阈值的时候就任务是字母'a'了,


更多MATLAB图像处理视频请点击  http://study.163.com/course/courseMain.htm?courseId=1003594013

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python在另一个函数中使用其他函数的变量_在另一个函数中访问函数的变量,如function() . var in python...

我在寻找一种正确的方法来访问另一个函数中的函数变量时遇到了一些问题 . 我正在制作远程操作类工具&#xff0c;因此我需要处理接收的命令[如exit或nircmdc.exe或telnet等] . 下面的代码不完整&#xff0c;但它是核心&#xff1a; def regular(): global data datac.recv(1024…

笔记一 Redis基础

在cmd 命令中运行redis 运行redis命令 &#xff1a;redis-cli Reids数据结构初探 数据结构有五种 string(字符串)、 list(列表)、set&#xff08;集合&#xff09;、hash&#xff08;散列&#xff09;、zset(有序集合) redis各类型的简单介绍 和最基础的命令 1.string&a…

C++获取指向二维数组的首元素指针

假设一个二维数组int a[][4] { { 3, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } };&#xff0c;获取指向其首个元素&#xff08;即3&#xff09;的指针方法为&#xff1a; int*pa[0]&a[0][0]*a; 说明&#xff1a; &#xff08;1&#xff09;二维…

matlab的四维图像数据可视化

1.颜色来表示第四维 前面已经学了三维图形可视化&#xff0c;所谓三维就是指x轴&#xff0c;y轴&#xff0c;z轴组成了我们的三维&#xff0c;那么第四维用什么来表示呢&#xff0c;我们这里要用颜色来表示第四维&#xff0c;所谓四维图形可视化就是在三维图形可视化的基础上&…

Mybatis 入门之resultMap与resultType讲解实例

resultMap&#xff1a;适合使用返回值是自定义实体类的情况 resultType&#xff1a;适合使用返回值得数据类型是非自定义的&#xff0c;即jdk的提供的类型 resultMap &#xff1a; type&#xff1a;映射实体类的数据类型 id&#xff1a;resultMap的唯一标识 column:库表的字段…

全球半导体产业60年兴衰启示录!

本文来自华泰证券&#xff0c;研究员张馨元、钱海、陈莉敏&#xff0c;感谢分享&#xff01;科技是当前行业配置不能忽视的主线&#xff0c;我们在今年 5 月 10 日发布的中期策略报告《无科技不牛市&#xff0c;以时间换空间》中提出&#xff0c;5G 时代物联网技术革命带来的是…

手机上python编程工具3和3h有区别吗_Python3.5内置模块之time与datetime模块用法实例分析...

本文实例讲述了Python3.5内置模块之time与datetime模块用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 1、模块的分类 a、标准库&#xff08;Python自带&#xff09;&#xff1a;sys、os模块 b、开源模块&#xff08;第三方模块&#xff09; c、自定义模块 2、内…

c++ string后面会添加‘\0‘

string类后面会添加\0&#xff0c;但这个\0不算入length里面 以一个例子就能说明&#xff1a; int main() {string s "hhh";cout << (s[3] \0)<<endl;cout << s.length() << endl;return 0; } 输出&#xff1a; 1 3

在visual studio code中配置python以及解决中文乱码问题

安装好 visual stuido code &#xff08;下面简称 “ VSC ”&#xff09;后&#xff0c;要想使用它运行调试 python 代码还需要做一些工作以解决下列问题&#xff1a; 搭建 python 环境print 打印中文出现乱码一、搭建 python 环境 在 VSC 中点击 F1 键&#xff0c;弹出控制台&…

华为加码布局 VR/AR趁势启航

来源&#xff1a;VR每日必看乘5G东风&#xff0c;VR/AR空间打开。随着5G的到来&#xff0c;5G高速和超低时延的特性将完美应对VR/AR发展的短板&#xff0c;商用牌照的发放将带领5G逐渐进入放量阶段&#xff0c;内外巨头均已开始大力布局。分析人士认为&#xff1a;第一阶段场景…

linux系列之常用运维命令整理笔录

本博客记录工作中需要的linux运维命令&#xff0c;大学时候开始接触linux&#xff0c;会一些基本操作&#xff0c;可是都没有整理起来&#xff0c;加上是做开发&#xff0c;不做运维&#xff0c;有些命令忘记了&#xff0c;所以现在整理成博客&#xff0c;当然vi&#xff0c;文…

C++ 传递字符串数组给函数参数

C 传数组给一个函数&#xff0c;数组类型自动转换为指针类型&#xff0c;因而传的实际是地址。 对于传入字符串数组同理&#xff0c;所以如果在函数中对传入的字符串数组进行改变&#xff0c;函数外的字符串数组也会同时改变 举个简单的例子&#xff1a; void change(char s…

Android高德地图自定义Markers的例子

下文为各位重点介绍关于Android高德地图自定义Markers的例子&#xff0c;希望这篇文章能够让各位理解到Android高德地图自定义Markers的方法。 之前的博客里说了地图的嵌入和定位&#xff0c;今天就说说在地图上显示一些我们想要的。在地图中有自带的Markers&#xff08;标记&a…

javaweb教务管理系统_基于Java web的教务管理系统

源码编号&#xff1a;B-E00033 点击查看(分类规则)项目类型&#xff1a;Java EE项目(非开源)项目名称&#xff1a;基于Java web的教务管理系统(TeachingSystem)当前版本&#xff1a;V1.0.1版本难度等级&#xff1a;✩✩复杂程度&#xff1a;✩✩ 点击查看难度等级用户类型&…

Science揭秘:为什么“好记性不如烂笔头”?

来源&#xff1a;中国生物技术网你还能记起你小学班长的名字吗&#xff1f;但我相信你肯定能记得同桌的名字&#xff0c;和与其共同经历的种种。但要再问你昨天新来同事的名字&#xff0c;你是否可以不假思索的回答出来&#xff1f;是不是有点儿困难&#xff1f;那为什么你能脱…

十个不可不看的Matlab GUI

截止到2012年6月2日&#xff0c;MatlabCentral上一共有1743个与"gui"有关的program。经过浏览前800个&#xff0c;选出以下比较有趣的程序。其中大部分没有经过测试&#xff0c;有可能无法使用或者功能不够理想&#xff0c;但至少可以作为一个starting point 吧。 Al…

C++链表插入节点函数为什么要传递头节点的二维指针

C链表插入一个节点的代码如下&#xff1a; struct ListNode {int m_value;ListNode * m_next; };void addListNode(ListNode** pHead, int value) {ListNode * pNew new ListNode();pNew->m_value value;pNew->m_next NULL;if (*pHead NULL){*pHead pNew;}else{Lis…

JAVA学习(十)__MessageFormat用法

MessageFormat用来格式化一个消息&#xff0c;通常是一个字符串&#xff0c;比如&#xff1a; String str "Im not a {0}, age is {1,number,short}", height is {2,number,#.#}; 而MessageFormat可以格式化这样的消息&#xff0c;然后将格式化后的字符串插入到模式…

中国机器人产业发展报告(2019)正式发布!

来源&#xff1a;世界机器人大会2019年8月25日&#xff0c;《中国机器人产业发展报告&#xff08;2019&#xff09;》于2019世界机器人大会闭幕式上正式发布&#xff0c;该报告为工业和信息化部2019-2021年财政专项《我国机器人产业发展水平评估体系构建与智能机器人产业链增长…

VS2013提示错误应输入表达式

原因是有些语句的空格为中文输入法下输入的空格&#xff0c;在提示错误的地方附近检查一下空格&#xff0c;最好把那附近的空格都用英文输入法再次输入一次