从空间域到频率的唯一途径是进行傅里叶变换;
傅里叶变换有明确的物理意义,即任何时域连续的复杂波形,通过傅里叶变换都可以变成一系列简谐波之和;
傅里叶变换的频谱分析是全局性的;
傅里叶变换在频率域里是具有实部和虚部的复函数;
一维离散傅里叶频谱: ∣ F ( u ) ∣ = R 2 ( u ) + I 2 ( u ) |F(u)|=\sqrt{R^2(u)+I^2(u)} ∣F(u)∣=R2(u)+I2(u) ;能量谱: E ( u ) = ∣ F ( u ) ∣ 2 E(u)=|F(u)|^2 E(u)=∣F(u)∣2 ;
相位谱: ϕ ( u ) = arctan ( I ( u ) / R ( u ) ) \phi(u)=\arctan(I(u)/R(u)) ϕ(u)=arctan(I(u)/R(u));
(1)通过实验进一步加深对图像傅立叶变换的理解;
(2)计算离散图像的傅里叶变换;
(3)掌握图像的傅里叶频谱图及离散傅里叶变换性质;
(4)掌握 MATLAB中的傅立叶变换函数;
(5)实现数字图像的傅立叶变换与反变换;
(6)了解相位谱和幅值谱的意义,并且分别重构;
(7)实现双谱重构实验
对数字图像 f ( x , y ) f(x,y) f(x,y),其二维离散傅里叶变换定义为:
F ( u , v ) = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x , y ) e − j 2 π ( u x M + v y N ) F(u,v)=\frac{1}{\sqrt{MN}}\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y) e^{-j2\pi(\frac{ux}{M}+\frac{vy}{N})} F(u,v)=MN1x=0∑M−1y=0∑N−1f(x,y)e−j2π(Mux+Nvy)
其中,u=0,1,…,M-1,v=0,1,…,N-1。
二维离散傅里叶反变换定义为:
f ( x , y ) = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 F ( u , v ) e j 2 π ( u x M + v y N ) f(x,y)=\frac{1}{\sqrt{MN}}\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}F(u,v) e^{j2\pi(\frac{ux}{M}+\frac{vy}{N})} f(x,y)=MN1x=0∑M−1y=0∑N−1F(u,v)ej2π(Mux+Nvy)
其中,x=0,1,…,M-1,y=0,1,…,N-1。
傅里叶频谱:
∣ F ( u , v ) ∣ = R 2 ( u , v ) + I 2 ( u , v ) |F(u,v)|=\sqrt{R^2(u,v)+I^2(u,v)} ∣F(u,v)∣=R2(u,v)+I2(u,v)
能量谱:
E ( u , v ) = ∣ F ( u , v ) ∣ 2 E(u,v)=|F(u,v)|^2 E(u,v)=∣F(u,v)∣2
相位谱:
ϕ ( u , v ) = arctan I ( u , v ) R ( u , v ) \phi(u,v)=\arctan\frac{I(u,v)}{R(u,v)} ϕ(u,v)=arctanR(u,v)I(u,v)
注意:正反傅里叶变换的唯一区别是幂的符号。
图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率值较高。傅里叶变换在实际中有非常明显的物理意义,设 f 是一 个能量有限的模拟信号,则其傅里叶变换就表示 f 的谱。
从纯粹的数学意义上看,傅里叶变换是将一个函数转换为一系列周期函数来处理的。从物理效果看,傅里叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。换句话说,傅里叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数,傅里叶逆变换是将图像的频率分布函数变换为灰度分布函数。
不同频率信息在图像结构中有不同的作用:
简短概括:
另外说明以下几点:
图像经过二维傅里叶变换后,其变换系数矩阵表明:
了解matlab实现傅里叶变换的相关函数
函数名 | 作用 |
---|---|
fft2 | 二维快速傅里叶正变换 |
ifft2 | 二维快速傅里叶反变换 |
fftshift | 将傅里叶变换原点移到中心 |
ifftshift | fftshift的反变换 |
real | 复数的实部 |
imag | 复数的虚部 |
注意:傅里叶变换一般都将利用平移性质,将中心移到零点。
利用 MATLAB 对图像进行离散傅里叶正变换及反变换,分析图像的傅里叶频谱
(1)首先, 生成一幅大小为 512*512 的黑色背景的中间叠加一个尺寸为 40*40 的白色矩阵的图像实现傅里叶正反变换;
matlab代码如下:
%% 生成一幅大小为 512*512 的黑色背景的中间叠加一个尺寸为 40*40 的白色矩阵的图像实现傅里叶正反变换;
clc;clear;close all; % 初始化
i=zeros(512,512); % 生成512*512为0的矩阵
i(236:276,236:276)=1; % 中间40*40赋值为1
i=im2double(i); % 将数据类型转换为double,数值范围变为[0,1]
i1=fft2(i); % 快速傅里叶变换
i2=fftshift(i1); % 将傅里叶变换进行象限转换,即将中心移到零点
i3=abs(i2); % 求傅里叶变换的模,将复数的double变成实数的double
i4=log(i3+1); % 将傅里叶变换结果的幅值映射到较小的正数
subplot(121);imshow(i);title('原图');
subplot(122);imshow(i4,[]);title('傅里叶变换频谱'); %显示傅里叶变换结果图,映射到[0,1]
运行结果如下:
(2)将相应的数字图像进行傅立叶变换并且反变换
matlab代码如下:
%% 将相应的数字图像进行傅立叶变换并且反变换
clc;clear;close all; % 初始化
i=imread('C:\Users\xcz\Desktop\matlab_example\Images\lena.bmp');
i=rgb2gray(i); % 将真彩色图像转换为灰度图像
i=im2double(i); % 将数据类型转换为double,数值范围变为[0,1]
i1=fft2(i); % 进行快速傅里叶变换
i2=fftshift(i1); % 将傅里叶变换进行象限转换,即将中心移到零点
i3=abs(i2); % 求傅里叶变换结果的模,即傅里叶频谱
i4=log(i3+1); % 将傅里叶变换结果映射到较小的正数
i5=ifftshift(i2); % 将变换的象限转换回去,即将中心复位
i6=ifft2(i5); % 快速傅里叶反变换
subplot(131);imshow(i);title('原图');
subplot(132);imshow(i4,[]);title('傅里叶变换频谱');%显示傅里叶变换结果图,映射到[0,1]
subplot(133);imshow(i6);title('傅里叶逆变换图像');
运行结果如下:
通过实验加深对傅立叶变换几个性质的理解,包括平移性质、尺度变换性质、旋转特性。
(1)平移性质:当空域中f(x,y)产生移动时,在频域中只发生相移,并不影响它的傅立叶变换的幅值。
%% 傅里叶变换平移性质:
%% 当空域中f(x,y)产生移动时,在频域中只发生相移,并不影响它的傅立叶变换的幅值。
clc;clear;close all; % 初始化
i1=zeros(512,512); % 生成512*512为0的矩阵
i1(236:276,236:276)=1; % 中间40*40赋值为1
i1=im2double(i1); % 将数据类型转换为double,数值范围变为[0,1]
i2=zeros(512,512); % 生成512*512为0的矩阵
i2(36:76,36:76)=1; % 左上角40*40赋值为1 xy皆发生了移动
i2=im2double(i2); % 将数据类型转换为double,数值范围变为[0,1]
% i1为图1,i2为图2,相对图1 中间白色部分向左上角移动了
% 对图1进行傅里叶变换
i1_fft=fftshift(fft2(i1)); % 进行傅里叶变换,并且象限转换
i1_margian=abs(i1_fft); % 求模,即幅值谱
i1_phase=angle(i1_fft); % 相位谱
% 对图2进行傅里叶变换
i2_fft=fftshift(fft2(i2)); % 进行傅里叶变换,并且象限转换
i2_margian=abs(i2_fft); % 求模,即幅值谱
i2_phase=angle(i2_fft); % 相位谱
subplot(231);imshow(i1);title('图1');
subplot(232);imshow(i2);title('图2');
subplot(233);imshow(log(i1_margian+1),[]);title('图1幅值谱'); % 参数'[]'是为了将其值线性拉伸
subplot(234);imshow(i1_phase,[]);title('图1相位谱');
subplot(235);imshow(log(i2_margian+1),[]);title('图2幅值谱');
subplot(236);imshow(i2_phase,[]);title('图2相位谱');
运行结果如下:
由结果可知,图像中某一部位的位置改变并不会改变图像的幅度谱,因为幅度谱表示各像素点的亮度信息,但具体点是被打乱的,所以幅度谱并不会改变。而相位谱因为记录了图像的所有点的相位信息,所以当图像中部分的位置发生改变时,相位谱会随之变化。
由实验可知,因为傅里叶变换的平移性质,当空域中f(x,y)产生移动时,在频域中只发生相移,并不影响它的傅立叶变换的幅值,即相位谱会发生改变,而幅值谱不会改变。
(2)尺度变换:当空域中f(x,y)产生缩放时,频域中傅立叶变换的幅值也相应的缩放。
%% 尺度变换:
%% 当空域中f(x,y)产生缩放时,频域中傅立叶变换的幅值也相应的缩放。
clc;clear;close all; % 初始化
I=imread('C:\Users\xcz\Desktop\matlab_example\Images\lena.bmp');
I=im2double(I); % 将数据类型转换为double,数值范围改为[0,1]
I=rgb2gray(I); %将真彩色图像转换为灰度图像
I1=imresize(I,0.5,'bicubic'); % 将图像缩小0.1倍,使用三次内插法
I2=imresize(I,5,'bicubic'); % 将图像放大5倍,使用三次内插法
% 分别求三幅图的幅值谱
I_fft=fftshift(fft2(I)); %进行傅里叶变换,并且进行象限转换
I_margian=abs(I_fft); % 幅值谱
I1_fft=fftshift(fft2(I1));
I1_margian=abs(I1_fft);
I2_fft=fftshift(fft2(I2));
I2_margian=abs(I2_fft);
subplot(231);imshow(I);title('原图');axis on;
subplot(232);imshow(I1);title('缩放0.5倍');axis on;
subplot(233);imshow(I2);title('放大5倍');axis on;
% 参数'[]'是为了将其值线性拉伸,log是为了更好显示图,加1是为了让图更亮
subplot(234);imshow(log(I_margian+1),[]);title('原图幅值谱');axis on;
subplot(235);imshow(log(I1_margian+1),[]);title('缩放0.5倍后幅值谱');axis on;
subplot(236);imshow(log(I2_margian+1),[]);title('放大5倍后幅值谱');axis on;
运行结果如下:
由运行结果可知,随着图像的缩放,图像傅里叶变换后的幅值谱也相应的缩放
(3)旋转特性:如果f(x,y)旋转了一个角度,那么对应的傅立叶变换也旋转了相同的角度。
%% 旋转特性:
%% 如果f(x,y)旋转了一个角度,那么对应的傅立叶变换也旋转了相同的角度。
clc;clear;close all; % 初始化
I=imread('C:\Users\xcz\Desktop\matlab_example\Images\lena.bmp');
I=im2double(I); % 将数据类型转换为double,数值范围改为[0,1]
I=rgb2gray(I); %将真彩色图像转换为灰度图像
I1=imrotate(I,45); %将图片逆时针旋转45°
I2=imrotate(I,90); %将图片逆时针旋转90°
% 分别求三幅图的幅值谱
I_fft=fftshift(fft2(I)); %进行傅里叶变换,并且进行象限转换
I_margian=abs(I_fft); % 幅值谱
I1_fft=fftshift(fft2(I1));
I1_margian=abs(I1_fft);
I2_fft=fftshift(fft2(I2));
I2_margian=abs(I2_fft);
subplot(231);imshow(I);title('原图');axis on;
subplot(232);imshow(I1);title('逆时针旋转45°');axis on;
subplot(233);imshow(I2);title('逆时针旋转90°');axis on;
% 参数'[]'是为了将其值线性拉伸,log是为了更好显示图,加1是为了让图更亮
subplot(234);imshow(log(I_margian+1),[]);title('原图幅值谱');axis on;
subplot(235);imshow(log(I1_margian+1),[]);title('旋转45°后幅值谱');axis on;
subplot(236);imshow(log(I2_margian+1),[]);title('旋转90°后幅值谱');axis on;
运行结果如下:
由结果可知,随着图像的旋转,其傅里叶变换结果也旋转相同的角度。
傅里叶变换的频谱一般分为幅值谱和相位谱,频谱是一个以频率为自变量的函数。频谱在每一个频率点的取值是一个复数。一个复数由模和辐角唯一地确定,所以可将频谱分解为幅度谱(即复数的模关于频率的函数)和相位谱(即复数的辐角关于频率的函数)。一般将频谱取模即是幅值谱
利用matlab求图像的频谱图、幅值谱和相位谱。并根据相位谱、幅值谱重建图像。
%% 利用matlab求图像的频谱图、幅值谱和相位谱
clc;clear;close all; % 初始化
I=imread('cameraman.tif');
I=im2double(I);
I1=fft2(I); % 傅里叶变换
I2=fftshift(I1); %象限转换
r=real(I2); i=imag(I2); % 求图像频域的实部和虚部
margin=log(abs(I2+1)); %图像幅度谱,加log便于显示
%phase=log(angle(I2)*180/pi); %图像相位谱
phase=angle(I2);
l=log(I2+1); % 图像频谱 加1是为了让频谱图更亮
p1_r=ifft2(abs(I1)); %幅值谱重构 使用未进行象限转换的幅值谱
p2_r=ifft2(exp(1i*(angle(I1)))); %相位谱重构 使用未进行象限转换的相位谱
% 此处1i表示复数
subplot(231);imshow(I);title('原图');
subplot(232);imshow(l,[]);title('频谱图');
subplot(233);imshow(margin,[]);title('幅值谱');
subplot(234);imshow(phase,[]);title('相位谱');
subplot(235);imshow(p1_r,[]);title('幅值谱重构');
subplot(236);imshow(p2_r,[]);title('相位谱重构');
运行结果如下:
由结果可知图像的幅度谱代表的是图像各像素点的亮度信息,即该像素应该显示什么颜色,但是做出来的幅度谱却不知道每一点在原图像中具体是哪一点,即幅度谱虽然存储了各个像素点的幅值信息,但是原像素点的位置已经被打乱,所以仅凭幅度谱是没有办法重构原图像的。幅度谱的中心是低频部分,越亮的地方代表的幅度越大。幅度谱中“十”字形亮线表示原图像中水平和垂直方向的分量较其他方向要多,因为在人们周围的自然场景中水平和垂直的线条出现的可能性较大。
而==相位谱记录的是所有点的相位信息,==看起来相位谱是一团噪声,这也说明相位信息是以一种更为隐蔽的方式出现,但它非常重要,因为相位信息中携带者图像的位置信息,没有它将无法从频谱还原出原图像。
可以看到仅有相位谱重构出来的图像还是可以看到一些轮廓信息的,利用相位谱记录的位置信息和幅度谱记录的亮度信息,就可以用双谱重构的方法恢复出原图像。
当使用双谱重构时:
%% 双谱重构关键代码
p3_r = ifft2(abs(I1).*exp(1i*(angle(I1))));%双谱重构
figure(1);imshow(p3_r,[]);title('双谱重构');
运行结果如下:
对两幅图像分别求其幅值谱和相位谱,将相位谱交换,分别进行图像重构。
matlab代码如下:
%% 对两幅图像分别求其幅值谱和相位谱,将相位谱交换,分别进行图像重构。
clc;clear;close all; %初始化
I1=imread('baby.jpg');
I2=imread('car2.jpg');
% 将彩色图像转换为灰度图片并且调整为相同大小
I1=rgb2gray(I1);I2=rgb2gray(I2);
I2=imresize(I2,[300 300]);I1=imresize(I1,[300 300]);
% 求傅里叶变换
I1_fft=fft2(I1); I2_fft=fft2(I2);
% 分别求幅值谱和相位谱
I1_margain=abs(I1_fft); I1_phase=angle(I1_fft);
I2_margain=abs(I2_fft); I2_phase=angle(I2_fft);
% 交换相位谱并重建复数矩阵
I1_re=I1_margain.*cos(I2_phase)+I1_margain.*sin(I2_phase).*1i;
I2_re=I2_margain.*cos(I1_phase)+I2_margain.*sin(I1_phase).*1i;
% 傅里叶反变换
I1_re1=abs(ifft2(I1_re)); I2_re1=abs(ifft2(I2_re)); % 此处取模是为了取复试的实部
%% 法二 效果相同
I1_re2 = ifft2(I1_margain.*exp(1i*(I2_phase)));%双谱重构
I2_re2 = ifft2(I2_margain.*exp(1i*(I1_phase)));%双谱重构
% 显示图像
subplot(221);imshow(I1);title('男孩原图');
subplot(222);imshow(I2);title('汽车原图');
subplot(223);imshow(I1_re1,[]);title('男孩的幅值谱和汽车的相位谱组合');
subplot(224);imshow(I2_re1,[]);title('汽车的幅值谱和男孩的相位谱组合');
运行结果如下:
经过此次的实验,
文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别
文章浏览阅读118次。分布式系统要求拆分分布式思想的实质搭配要求分布式系统要求按照某些特定的规则将项目进行拆分。如果将一个项目的所有模板功能都写到一起,当某个模块出现问题时将直接导致整个服务器出现问题。拆分按照业务拆分为不同的服务器,有效的降低系统架构的耦合性在业务拆分的基础上可按照代码层级进行拆分(view、controller、service、pojo)分布式思想的实质分布式思想的实质是为了系统的..._分布式系统运维工具
文章浏览阅读174次。1.数据源准备2.数据处理step1:数据表处理应用函数:①VLOOKUP函数; ② CONCATENATE函数终表:step2:数据透视表统计分析(1) 透视表汇总不同渠道用户数, 金额(2)透视表汇总不同日期购买用户数,金额(3)透视表汇总不同用户购买订单数,金额step3:讲第二步结果可视化, 比如, 柱形图(1)不同渠道用户数, 金额(2)不同日期..._exce l趋势分析数据量
文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置
文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖
文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...
文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序
文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码
文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型
文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件
文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令
文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线