图像处理中正交变换的目的

2018-12-05 10:54:27 weixin_40851250 阅读数 8002
  • 人与世界的交互、视频信息的意义

    通过本系列课程,观众有望理解视频压缩编码技术的整体发展,精通H.264视频编码技术的框架与细节,为进一步研究H.265/HEVC编码标准、音视频流媒体、视频直播点播等技术奠定坚实的基础。本系列课程适合多媒体方向的...

    34609人学习 殷汶杰
    免费试看

虽然写这个博客主要目的是为了给我自己做一个思路记忆录,但是如果你恰好点了进来,那么先对你说一声欢迎。我并不是什么大触,只是一个菜菜的学生,如果您发现了什么错误或者您对于某些地方有更好的意见,非常欢迎您的斧正!

目录

楔子

①傅里叶变换的作用

②知识储备

1、泰勒级数

2、欧拉公式(真正的宇宙第一公式)

3、三角级数

4、三角函数系的正交性

③傅里叶变换对

④傅立叶变换的相关概念

⑤一维傅立叶逆变换

⑥傅立叶谱的平移

⑦傅立叶变换频谱

⑧二维Fourier变换的应用

1、Fourier变换在图像滤波中的应用

2、Fourier变换在图像压缩中的应用

3、Fourier变换在卷积中的应用


楔子

之前就已经总结过一次,但是我觉得真的写的晦涩难懂,都是公式,让我感觉哪怕以后自己再看这篇文章,连自己都不会有勇气去读完它。于是只好破釜沉舟,重新学习傅里叶!(其实我已经学过这个了,现在学习这个数字图像处理,竟然又遇到了傅里叶,不得不感慨,它真的无所不在!大学里总是伴随着泰勒、拉格朗日、柯西、傅里叶,但是不得不承认,傅里叶变换真的很牛!)我不是知识的讲述者,我只是一个大佬们对这些知识的理解的搬运工。

强烈推荐两篇文章:

傅里叶分析之掐死教程(完整版

https://zhuanlan.zhihu.com/p/19763358


欧拉公式——真正的宇宙第一公式

http://k.sina.com.cn/article_6385529085_17c9b70fd001006gjp.html?from=science

以下就是正文部分了

 

①傅里叶变换的作用

首先你搜索“傅里叶变换”,你将得到一个公式:

你会想,它的意义是什么呢?我要这个公式有何用!

我们不难发现,傅里叶变换总是伴随着“信号”,看一下下图中这个原信号,是不是晦涩难懂,而傅里叶变换的作用,就是将这样一个复杂的波形拆分成简单的正弦波余弦波叠加。(任何连续周期信号可以由一组适当的正弦曲线组合而成)

就像这样:从b->a->c的巨大演变,只需要一个傅里叶!

②知识储备

1、泰勒级数

这又是一个麻烦的东西,泰勒级数是干什么用的呢?

就是用多项式函数去逼近光滑函数。

(https://www.zhihu.com/question/21149770)

这是我在网上看到的一个解释,我觉得是最贴切的解释了!

还有一幅图可以感受一下,请点击这里。(打不开就用下面的链接)

https://www.matongxue.com/madocs/7.html

接下来看一下它的系统性定义,以及一些常见的泰勒级数,就不多讲了。

泰勒级数:如果函数f(x)在它含点x0的某一区间(a,b)内具有的任何导数都存在,因此对任何正整数n,有下面的n阶泰勒公式成立

2、欧拉公式(真正的宇宙第一公式

作用:将正弦波统一成了简单的指数形式

它的图像意义

3、三角级数

数学中,三角级数是任何具有下述形式的级数

具有以下形式时,该级数称为傅立叶级数

其中可积函数

傅里叶级数是一种三角级数,傅里叶级数也常称为三角级数。但并不是所有三角级数都是傅立叶级数。

4、三角函数系的正交性

 

组成三角级数的函数系:1,cosx,sinx,cos2x,sin2x,...,cosnx,sinnx,...

1)其中任意两个不同的函数之积在[-π,π]上的积分等于0

2)两个相同的函数的乘积在[-π,π]上的积分不等于0

将三角函数展开成傅里叶级数

③傅里叶变换对

④傅立叶变换的相关概念

⑤一维傅立叶逆变换

⑥傅立叶谱的平移

⑦傅立叶变换频谱

⑧二维Fourier变换的应用

1、Fourier变换在图像滤波中的应用

首先,我们来看Fourier变换后的图像,中间部分为低频部分,越靠外边频率越高。因此,我们可以在Fourier变换图中,选择所需要的高频或是低频滤波

 

2、Fourier变换在图像压缩中的应用

变换系数刚好表现的是各个频率点上的幅值。在小波变换没有提出时,用来进行压缩编码。考虑到高频反映细节、低频反映景物概貌的特性。往往认为可将高频系数置为0,骗过人眼。

3、Fourier变换在卷积中的应用

        从前面的图像处理算法中知道,如果抽象来看,其实都可以认为是图像信息经过了滤波器的滤波(如:平滑滤波、锐化滤波等 )。 如果滤波器的结构比较复杂时,直接进行时域中的卷积运算是不可思议的。

 

参考文章(感谢大佬!):

傅里叶分析之掐死教程(完整版)

https://zhuanlan.zhihu.com/p/19763358

 

欧拉公式——真正的宇宙第一公式

http://k.sina.com.cn/article_6385529085_17c9b70fd001006gjp.html?from=science

2019-03-10 09:33:00 weixin_30570101 阅读数 383
  • 人与世界的交互、视频信息的意义

    通过本系列课程,观众有望理解视频压缩编码技术的整体发展,精通H.264视频编码技术的框架与细节,为进一步研究H.265/HEVC编码标准、音视频流媒体、视频直播点播等技术奠定坚实的基础。本系列课程适合多媒体方向的...

    34609人学习 殷汶杰
    免费试看

图像处理中正交变换的目的是什么?图像变换主要用于那些方面?

图像处理中正交变换的目的是将图像的能量尽量集中在少量系数上,从而最大限度地去除原始数据中的相关性。

主要用于图像特征提取、图像增强、图像复原及图像编码等处理中从而使后续运算变得简单。

转载于:https://www.cnblogs.com/lyj0123/p/10504220.html

2017-09-25 09:41:08 VonSdite 阅读数 5323
  • 人与世界的交互、视频信息的意义

    通过本系列课程,观众有望理解视频压缩编码技术的整体发展,精通H.264视频编码技术的框架与细节,为进一步研究H.265/HEVC编码标准、音视频流媒体、视频直播点播等技术奠定坚实的基础。本系列课程适合多媒体方向的...

    34609人学习 殷汶杰
    免费试看

新博客地址: vonsdite.cn

数字图像处理研究的主要内容

  •     数字图像处理是指将一幅图像变成另一幅经过修改(改进)的图像,是一个由图像到图像的过程。其主要研究内容如下:
    
    • 图像变换
    • 图像增强
    • 图像恢复
    • 图像分割
    • 数学形态学
    • 图像编码与压缩

图像变换

  • 灰度变换:包括灰度线性变换、阈值变换、窗口变换、灰度拉伸与均衡等。灰度变换目的在于:控制图像灰度直方图的分布,改善输出的图像。

  • 几何变换:图像平移、镜像、转置、缩放和旋转等。对于数字化标定、图像配准、校正、投影及特殊视觉特技效果的生成十分有用。

  • 正交变换:包括傅立叶变换、离散余弦变换、Walsh变换、小波变换等。正交变换是将图像的二位数据矩阵看作特殊的二维信号,并将其变换到频域,从而加强对图像信息的辨识与理解。广泛运用于图像特征提取、图像增强、图像压缩和图像识别领域。


图像增强

  •   空域滤波增强和频域滤波增强技术,具体方法如**图像模板操作、平滑、锐化、中值滤波、低/高通滤波、伪色彩增强等。**
    
  • 主要目的是根据任务目标突出图像中感兴趣的信息,消除干扰,改善图像的视觉效果或增强便于机器识别的信息。


图像恢复

  • 根据图像退化模型,消除或减轻在图象获取及传输过程中造成的图像品质下降即退化现象,恢复图像的本来面目。退化包括由成像系统光学特性造成的歧变以及噪声和相对运动造成的模糊等情况。 
    
  • 运动模糊图像的恢复

    运动模糊图像的恢复


图像分割

  •     包括**阈值分割法、基于梯度的分割法及边界检测与跟踪**等。
    
  • 主要目的是根据图像的某些特征将图像划分为互不重叠的区域,以便于对图像中的物体或目标进行分析与识别。图像分割是图像分析和理解的基础


数学形态学

  •     形态学运算主要用来处理**二值图像**,其数学基础是集合论。常见的形态学运算有**膨胀、腐蚀、开运算、闭运算、细化**等。
    
  • 数学形态学是分析图像几何特征的有利工具。

图像编码与压缩

  • 要在计算机连续显示分辨率为1280x1024的24位真彩色高质量的电视图像,按每秒30祯计算,显示1分钟需要6.6GB。可见,数字图像数据的压缩问题是多媒体技术的重要研究课题。
    
  • 图像编码与压缩就是对要处理的图像数据用一定的规则进行变换和组合,从而达到以尽可能小的代码来表示尽可能多的数据信息的目的,常见的压缩编码有**霍夫曼编码、游程编码、JPEG编码**等。
    
  • 研究压缩图像数据的方法,需要研究并利用图像的冗余特征如统计冗余、生理视觉冗余、知识冗余等。
    
2016-05-02 16:18:14 liaozali9022 阅读数 16383
  • 人与世界的交互、视频信息的意义

    通过本系列课程,观众有望理解视频压缩编码技术的整体发展,精通H.264视频编码技术的框架与细节,为进一步研究H.265/HEVC编码标准、音视频流媒体、视频直播点播等技术奠定坚实的基础。本系列课程适合多媒体方向的...

    34609人学习 殷汶杰
    免费试看

一、前已完成任务情况 

    1、概况

设计题目:基于正交变换与自适应滤波的图像去噪算法

设计目的:设计一种基于正交变换域自适应滤波器的的图像去噪算法,在消除图像噪声的同时尽可能地保留图像固有的信息。

提取出三个关键词:正交变换、自适应滤波、图像去噪

matlab设计流程:

    与单纯运用某种自适应算法相比,基于小波分解的自适应滤波算法在收敛速度和稳定性上都有了很大的提高

 

2、小波变换的基本理论

 

 

 

       示意:尺度越大,采用越大的时间窗,尺度越小,采用越短的时间窗,即尺度与频率成反比。

在时频两域都具有表征信号局部特征的能力,其在低频部分具有较高的频率分辨

率和较低的时间分辨率,在高频部分具有较高的时间分辨率和较低的频率分辨率,

所以被誉为分析信号的数字显微镜

 

       小波变换与傅里叶变换对比的优点:短时傅立叶分析是把一个短时间的窗函数加在信号上,再对这一部分加窗的信号做傅立叶变换,当然,假定了在短时间内信号是平稳的。然后移动窗函数,对整个时间轴上的信号做短时傅立叶分析。但是,又有问题出现了,短时傅立叶分析一旦确定了窗函数,窗函数的形状便不再改变,于是短时傅立叶分析对于信号的时频分辨率也随之确定。

而我们希望稍微智能一点,即对于变化剧烈的信号,时间分辨率能高一点,频率分辨率可以降低,而对于变化平坦的信号,频率分辨率要高一些,时间分辨率可以低点。于是小波分析便产生了。

小波分析同样对信号在一短时间内做加窗(小波函数)分析,只是这个窗,即小波函数既可以在时间轴上移动,又可以伸缩,伸缩便意味着时频分辨率的改变。

       小波变换的物理表现:分解的结果是产生长度减半的两个部分,一个是经低通滤波器产生的原始信号的平滑部分,另一个则是经高通滤波器产生的原始信号细节部分。

    不同j所确定的频带是独立的,随j变化相互独立的频带覆盖了整个频率轴,分辨率j反应了频带的位置和带宽把信号分解到一系列相互独立的频带上分辨率j-1时的近似信号=f(x)在分辨率为j时的近似部分+细节部分

再对低频部分进行相似运算

 

3、小波变换在matlab中的使用

[C, S] = wavedec2(x, n, wname); % 对图像进行小波分解

小波变换的层数选择:通常分解层数过多,并且对所有的各层小波空间的系数都进行阈值处理会造成信号的信息丢失严重,去噪后的信噪比反而下降,同时导致运算量增大,使处理变慢.

分解层数过少则去噪效果不理想,信噪比提高不多,但不会出现信噪比下降的情况.

小波函数的选取:按常理选取了sym4

 

[C,S]的含义C=[A(n)|H(n)|D(n)|………H(1)|V(1)|D(1)]

h ,v ,d 分别反映水平、垂直、对角线方向

S(1,:)=size of approximation coefficients(n)

下图的解释更直观一点:

 

 

 

 

 

 

 

 

部分程序运行:原始图像→加噪图像(同时加入高斯噪声和椒盐噪声)→小波分解后的图像显示

.M=imread('detfinger1.png'); 

%读取MATLAB中的名为detfinger的图像  分辨率:512×512

subplot(1,2,1) 

imshow(M);           %显示原始图像 

title('原始图像') 

 

P1=imnoise(M,'gaussian',0.02);     

%加入高斯躁声,方差为0.02的高斯噪声

 

P2=imnoise(P1,'salt &pepper',0.02);

%同时加入高斯噪声和椒盐躁声 

subplot(1,2,2) 

imshow(P2);%加入椒盐躁声后显示图像 

title('加入高斯椒盐躁声后');

%%对加入高斯噪声的图像进行小波分解

P2=double(P2);

[CA,CH,CV,CD]= dwt2(P2,'db1 ');

y =[CA,CH;CV,CD];

y=uint8(y);

subplot(3,1,3); 

imshow(y); 

title('小波分解');

4、滤波器的特性

我的思路:先了解维纳滤波器的原理再进一步改进,理解自适应滤波器,进行自适应滤波器的设计,再进行自适应滤波器的组合设计,从而实现去噪功能

 

维纳滤波器:根据平稳随机信号的全部过去和当前的观察数据来估计信号的当前值,在最小均方误差的条件下得到系统的传递函数,参数是固定的,适用于平稳随机信号。

卡尔曼滤波器:根据当前时刻数据的观测值和前一时刻对该一时刻的预测值进行递推数据。它自动调节本身的冲击响应特性(自动调节数字滤波器的系数),以适应信号变化的特性,从而达到最优化滤波。它的参数是时变的,适用于非平稳随机信号。

这两种滤波器最优滤波的条件:噪声的统计特性先验已知

但实际应用中,常常无法得到这些统计特征的先验知识(统计特性是随时间变化的),因此实现不了最优滤波。

自适应滤波器:无法得到一些统计特性的先验知识(统计特性随时间变化)

而自适应滤波器在输入信号统计特性未知或者统计特性变化时,能够自动调节自身的参数,使其按照某种准则达到最优滤波。由于自适应滤波器具有这种特性,自提出以来,在实际工程中的众多领域得到了广泛应用。

 

5、如何设计和建立自适应滤波器

   自适应滤波器工作原理是:系统能够按照某种算法自动调节权系数,使其实际输出和期望输出的均方误差达到最小值。

   自适应滤波器的结构:有FIRIIR两种。由于IIR滤波器存在稳定性的问题,因此一般采用FIR滤波器。由于FIR滤波器横向结构的算法具有容易实现和计算量少等优点,在对收敛速度不是很快的场合,多采用FIR作为自适应滤波器结构。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

自适应滤波算法:

自适应滤波器的核心部分就是自适应滤波算法,基于不同的准则,最常用的自适应滤波算法是LMS算法和RLS算法,LMS算法以最小均方误差为准则,RLS算法(递归最小二乘算法)以最小误差平方和为准则。

LMS算法由于其具有计算量小,稳定性好,易于实现等优点,被广泛使用。

LMS算法中均方误差表示为:

使均方误差达到最小值时,得到最佳权系数w*,应满足下列方程:在实际中,LMS 迭代算法是以最速下降法为原则进行的,用公式表示为:

式中,是自适应步长  ( n) 为迭代的梯度。

这里来估计均方误差 MSE 的梯度,并以此梯度估计值代替最速下降法中理论情况下的梯度真值,LMS( 最小均方算法进行梯度估计的方法是以误差信号的每一次迭代的瞬间时平方值代替其均方值,并以此来估计梯度。

在自适应滤波器的设计过程中,滤波器阶数 N和步长μ 等参数的选取对仿真结果的影响总结如下.

(1)自适应算法中步长 μ 的选择:μ 的大小影响算法的收敛速度。  其中,为矩阵的最大特征值μ 取值小,收敛速度慢,计算工作量大,但滤波性能较好。μ 取值大,收敛速度快,计算工作量小,滤波性能较差。但 μ 大到一定值时,收敛速度变化不明显,且取值过大,会造成计算溢出.

(2)自适应滤波器阶数 的影响: N 不可以任意选取,需要根据经验加上实际仿真验证比较才能最终确定.

当阶数 取值大时,迭代次数增加,收敛速度变快。但当阶数 大到一定程度,收敛速度变化不明显,且可能引起系数迭代过程不收敛.

 

 

自适应滤波器原理:

输入信号x(n)

、参考信号d(n)、误差信号e(n)

e(n)y(n)d(n)的误差信号,根据最小均方误差算法调节自适应滤波器算法的参数,来优化滤波器结构,从而实现尽可能地保留图像固有的信息。

LMS算法最核心的思想是用平方误差代替均方误差,基本的LMS算法为:

w(k,n+ 1)=w(k,n)+ 2μe(n)x(n-k)

其中,w(k,n)w(k,n+ 1)分别为迭代前后的系数值;nn+ 1为前后两个时刻;k= 0,1,

… ,N- 1,N为滤波器的阶数;μ为收敛因子;e(n)=d(n)-y(n)=d(n)-xT(n)w(n)=d(n)-wT(n)x(n)为误差信号;x(n-k)为输入信号;y(n)=xT(n)w(n)为输出信号

6、matlab仿真

 

进行小波变换→  进行滤波后→  再进行图像重构→ 再小波反变换进行图像重构→先用维纳滤波器再用自适应滤波器替换

 

 

 

%%对加入高斯噪声的图像进行小波分解

J=double(J);

[CA,CH,CV,CD]= dwt2(J,'db1 ');

% [c,s]=wavedec2(j,1,'haar');

y =[CA,CH;CV,CD];

y=uint8(y);

subplot(2,2,3); 

imshow(y);

title('小波分解');

 

%xx=wiener2(CA,[3 3]); %对加噪图像进行二维自适应维纳滤波   %滤波器窗口大小

yy=wiener2(CH,[3 3]); %对加噪图像进行二维自适应维纳滤波   %滤波器窗口大小

zz=wiener2(CV,[3 3]); %对加噪图像进行二维自适应维纳滤波   %滤波器窗口大小

qq=wiener2(CD,[3 3]); %对加噪图像进行二维自适应维纳滤波   %滤波器窗口大小

 

%%%图像重构    

XX = idwt2(CA,yy,zz,qq,'db1');    

 

XX=uint8(XX);

subplot(2,2,4); 

imshow(XX); 

title('重构以后的图像');

 

                                                     

 

 

 

 

 

 

 

6自适应滤波器的组合设计:

    但是当信号源中混有多种干扰噪声时,单独一个滤波器不能达到抵消多种干扰噪声的要求。针对信号源中混有的多种干扰噪声问题,提出了自适应滤波器的组合设计问题。

分为线性自适应滤波器和非线性自适应滤波器,非线性自适应滤波器具有更强的信号处理功能,但是计算比较复杂,实际用的更多的是线性自适应滤波器。

 

总结:Mallat算法和LMS算法结合。

虽然算法简单,运算量小,易于实现,但由于它的收敛速度对输入信号的自相关函数矩阵特征值的分布敏感如果分布太散,即最大值与最小值差异太大,收敛速度就会很慢,因此利用小波的时一频局部特性,就可以减小自适应滤波器输入向量自相关阵特征值的分散程度,大大增加了算法的收敛步长,提高了算法的收敛速度和稳定性。

 

(不选)      基于小波分解重构的自适应滤波算法比仅进行小波分解的自适应滤波算法滤波精度要稍高一些,但由于需要信号重构,算法的复杂度随之增加,因此该算法实时性相对稍差。

2019-04-23 16:24:29 Eastmount 阅读数 19613
  • 人与世界的交互、视频信息的意义

    通过本系列课程,观众有望理解视频压缩编码技术的整体发展,精通H.264视频编码技术的框架与细节,为进一步研究H.265/HEVC编码标准、音视频流媒体、视频直播点播等技术奠定坚实的基础。本系列课程适合多媒体方向的...

    34609人学习 殷汶杰
    免费试看

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

该系列在github所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

同时推荐作者的C++图像系列知识:
[数字图像处理] 一.MFC详解显示BMP格式图片
[数字图像处理] 二.MFC单文档分割窗口显示图片
[数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
[数字图像处理] 四.MFC对话框绘制灰度直方图
[数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
[数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
[数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

前文参考:
[Python图像处理] 一.图像处理基础知识及OpenCV入门函数
[Python图像处理] 二.OpenCV+Numpy库读取与修改像素
[Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理
[Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波
[Python图像处理] 五.图像融合、加法运算及图像类型转换
[Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移
[Python图像处理] 七.图像阈值化处理及算法对比
[Python图像处理] 八.图像腐蚀与图像膨胀
[Python图像处理] 九.形态学之图像开运算、闭运算、梯度运算
[Python图像处理] 十.形态学之图像顶帽运算和黑帽运算
[Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图
[Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正
[Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽运算
[Python图像处理] 十四.基于OpenCV和像素处理的图像灰度化处理
[Python图像处理] 十五.图像的灰度线性变换
[Python图像处理] 十六.图像的灰度非线性变换之对数变换、伽马变换
[Python图像处理] 十七.图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子和Laplacian算子
[Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子
[Python图像处理] 十九.图像分割之基于K-Means聚类的区域分割
[Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效
[Python图像处理] 二十一.图像金字塔之图像向下取样和向上取样

前面一篇文章我讲解了Python图像量化、采样处理及图像金字塔。本文主要讲解图像傅里叶变换的相关内容,在数字图像处理中,有两个经典的变换被广泛应用——傅里叶变换和霍夫变换。其中,傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪、图像增强等处理。基础性文章,希望对你有所帮助。同时,该部分知识均为杨秀璋查阅资料撰写,转载请署名CSDN+杨秀璋及原地址出处,谢谢!!

1.图像傅里叶变换
2.Numpy实现傅里叶变换
3.Numpy实现傅里叶逆变换
4.OpenCV实现傅里叶变换
5.OpenCV实现傅里叶逆变换


PS:文章参考自己以前系列图像处理文章及OpenCV库函数,同时参考如下文献:
《数字图像处理》(第3版),冈萨雷斯著,阮秋琦译,电子工业出版社,2013年.
《数字图像处理学》(第3版),阮秋琦,电子工业出版社,2008年,北京.
《OpenCV3编程入门》,毛星云,冷雪飞,电子工业出版社,2015,北京.
百度百科-傅里叶变换
网易云课堂-高登教育 Python+OpenCV图像处理
安安zoe-图像的傅里叶变换
daduzimama-图像的傅里叶变换的迷思----频谱居中
tenderwx-数字图像处理-傅里叶变换在图像处理中的应用
小小猫钓小小鱼-深入浅出的讲解傅里叶变换(真正的通俗易懂)


一.图像傅里叶变换原理

傅里叶变换(Fourier Transform,简称FT)常用于数字信号处理,它的目的是将时间域上的信号转变为频率域上的信号。随着域的不同,对同一个事物的了解角度也随之改变,因此在时域中某些不好处理的地方,在频域就可以较为简单的处理。同时,可以从频域里发现一些原先不易察觉的特征。傅里叶定理指出“任何连续周期信号都可以表示成(或者无限逼近)一系列正弦信号的叠加。”

下面引用李老师 “Python+OpenCV图像处理” 中的一个案例,非常推荐同学们去购买学习。如下图所示,他将某饮料的制作过程的时域角度转换为频域角度。

绘制对应的时间图和频率图如下所示:

傅里叶公式如下,其中w表示频率,t表示时间,为复变函数。它将时间域的函数表示为频率域的函数f(t)的积分。

傅里叶变换认为一个周期函数(信号)包含多个频率分量,任意函数(信号)f(t)可通过多个周期函数(或基函数)相加合成。从物理角度理解,傅里叶变换是以一组特殊的函数(三角函数)为正交基,对原函数进行线性变换,物理意义便是原函数在各组基函数的投影。如下图所示,它是由三条正弦曲线组合成。

傅里叶变换可以应用于图像处理中,经过对图像进行变换得到其频谱图。从谱频图里频率高低来表征图像中灰度变化剧烈程度。图像中的边缘信号和噪声信号往往是高频信号,而图像变化频繁的图像轮廓及背景等信号往往是低频信号。这时可以有针对性的对图像进行相关操作,例如图像除噪、图像增强和锐化等。

二维图像的傅里叶变换可以用以下数学公式(15-3)表达,其中f是空间域(Spatial Domain))值,F是频域(Frequency Domain)值

对上面的傅里叶变换有了大致的了解之后,下面通过Numpy和OpenCV分别讲解图像傅里叶变换的算法及操作代码。


二.Numpy实现傅里叶变换

Numpy中的 FFT包提供了函数 np.fft.fft2()可以对信号进行快速傅里叶变换,其函数原型如下所示,该输出结果是一个复数数组(Complex Ndarry)。

fft2(a, s=None, axes=(-2, -1), norm=None)

  • a表示输入图像,阵列状的复杂数组
  • s表示整数序列,可以决定输出数组的大小。输出可选形状(每个转换轴的长度),其中s[0]表示轴0,s[1]表示轴1。对应fit(x,n)函数中的n,沿着每个轴,如果给定的形状小于输入形状,则将剪切输入。如果大于则输入将用零填充。如果未给定’s’,则使用沿’axles’指定的轴的输入形状
  • axes表示整数序列,用于计算FFT的可选轴。如果未给出,则使用最后两个轴。“axes”中的重复索引表示对该轴执行多次转换,一个元素序列意味着执行一维FFT
  • norm包括None和ortho两个选项,规范化模式(请参见numpy.fft)。默认值为无

Numpy中的fft模块有很多函数,相关函数如下:

#计算一维傅里叶变换
numpy.fft.fft(a, n=None, axis=-1, norm=None)
#计算二维的傅里叶变换
numpy.fft.fft2(a, n=None, axis=-1, norm=None)
#计算n维的傅里叶变换
numpy.fft.fftn()
#计算n维实数的傅里叶变换
numpy.fft.rfftn()
#返回傅里叶变换的采样频率
numpy.fft.fftfreq()
#将FFT输出中的直流分量移动到频谱中央
numpy.fft.shift()

下面的代码是通过Numpy库实现傅里叶变换,调用np.fft.fft2()快速傅里叶变换得到频率分布,接着调用np.fft.fftshift()函数将中心位置转移至中间,最终通过Matplotlib显示效果图。

# -*- coding: utf-8 -*-
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

#读取图像
img = cv.imread('test.png', 0)

#快速傅里叶变换算法得到频率分布
f = np.fft.fft2(img)

#默认结果中心点位置是在左上角,
#调用fftshift()函数转移到中间位置
fshift = np.fft.fftshift(f)       

#fft结果是复数, 其绝对值结果是振幅
fimg = np.log(np.abs(fshift))

#展示结果
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Original Fourier')
plt.axis('off')
plt.subplot(122), plt.imshow(fimg, 'gray'), plt.title('Fourier Fourier')
plt.axis('off')
plt.show()

输出结果如图15-2所示,左边为原始图像,右边为频率分布图谱,其中越靠近中心位置频率越低,越亮(灰度值越高)的位置代表该频率的信号振幅越大。


三.Numpy实现傅里叶逆变换

下面介绍Numpy实现傅里叶逆变换,它是傅里叶变换的逆操作,将频谱图像转换为原始图像的过程。通过傅里叶变换将转换为频谱图,并对高频(边界)和低频(细节)部分进行处理,接着需要通过傅里叶逆变换恢复为原始效果图。频域上对图像的处理会反映在逆变换图像上,从而更好地进行图像处理。

图像傅里叶变化主要使用的函数如下所示:

#实现图像逆傅里叶变换,返回一个复数数组
numpy.fft.ifft2(a, n=None, axis=-1, norm=None)
#fftshit()函数的逆函数,它将频谱图像的中心低频部分移动至左上角
numpy.fft.fftshift()
#将复数转换为0至255范围
iimg = numpy.abs(逆傅里叶变换结果)

下面的代码分别实现了傅里叶变换和傅里叶逆变换。

# -*- coding: utf-8 -*-
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

#读取图像
img = cv.imread('Lena.png', 0)

#傅里叶变换
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
res = np.log(np.abs(fshift))

#傅里叶逆变换
ishift = np.fft.ifftshift(fshift)
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)

#展示结果
plt.subplot(131), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.axis('off')
plt.subplot(132), plt.imshow(res, 'gray'), plt.title('Fourier Image')
plt.axis('off')
plt.subplot(133), plt.imshow(iimg, 'gray'), plt.title('Inverse Fourier Image')
plt.axis('off')
plt.show()

输出结果如图15-4所示,从左至右分别为原始图像、频谱图像、逆傅里叶变换转换图像。


四.OpenCV实现傅里叶变换

OpenCV 中相应的函数是cv2.dft()和用Numpy输出的结果一样,但是是双通道的。第一个通道是结果的实数部分,第二个通道是结果的虚数部分,并且输入图像要首先转换成 np.float32 格式。其函数原型如下所示:

dst = cv2.dft(src, dst=None, flags=None, nonzeroRows=None)

  • src表示输入图像,需要通过np.float32转换格式
  • dst表示输出图像,包括输出大小和尺寸
  • flags表示转换标记,其中DFT _INVERSE执行反向一维或二维转换,而不是默认的正向转换;DFT _SCALE表示缩放结果,由阵列元素的数量除以它;DFT _ROWS执行正向或反向变换输入矩阵的每个单独的行,该标志可以同时转换多个矢量,并可用于减少开销以执行3D和更高维度的转换等;DFT _COMPLEX_OUTPUT执行1D或2D实数组的正向转换,这是最快的选择,默认功能;DFT _REAL_OUTPUT执行一维或二维复数阵列的逆变换,结果通常是相同大小的复数数组,但如果输入数组具有共轭复数对称性,则输出为真实数组
  • nonzeroRows表示当参数不为零时,函数假定只有nonzeroRows输入数组的第一行(未设置)或者只有输出数组的第一个(设置)包含非零,因此函数可以处理其余的行更有效率,并节省一些时间;这种技术对计算阵列互相关或使用DFT卷积非常有用

注意,由于输出的频谱结果是一个复数,需要调用cv2.magnitude()函数将傅里叶变换的双通道结果转换为0到255的范围。其函数原型如下:

cv2.magnitude(x, y)

  • x表示浮点型X坐标值,即实部
  • y表示浮点型Y坐标值,即虚部
    最终输出结果为幅值,即:

完整代码如下所示:

# -*- coding: utf-8 -*-
import numpy as np
import cv2
from matplotlib import pyplot as plt

#读取图像
img = cv2.imread('Lena.png', 0)

#傅里叶变换
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)

#将频谱低频从左上角移动至中心位置
dft_shift = np.fft.fftshift(dft)

#频谱图像双通道复数转换为0-255区间
result = 20*np.log(cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1]))

#显示图像
plt.subplot(121), plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(result, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

输出结果如图15-5所示,左边为原始“Lena”图,右边为转换后的频谱图像,并且保证低频位于中心位置。


五.OpenCV实现傅里叶逆变换

在OpenCV 中,通过函数cv2.idft()实现傅里叶逆变换,其返回结果取决于原始图像的类型和大小,原始图像可以为实数或复数。其函数原型如下所示:

dst = cv2.idft(src[, dst[, flags[, nonzeroRows]]])

  • src表示输入图像,包括实数或复数
  • dst表示输出图像
  • flags表示转换标记
  • nonzeroRows表示要处理的dst行数,其余行的内容未定义(请参阅dft描述中的卷积示例)

完整代码如下所示:

# -*- coding: utf-8 -*-
import numpy as np
import cv2
from matplotlib import pyplot as plt

#读取图像
img = cv2.imread('Lena.png', 0)

#傅里叶变换
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
dftshift = np.fft.fftshift(dft)
res1= 20*np.log(cv2.magnitude(dftshift[:,:,0], dftshift[:,:,1]))

#傅里叶逆变换
ishift = np.fft.ifftshift(dftshift)
iimg = cv2.idft(ishift)
res2 = cv2.magnitude(iimg[:,:,0], iimg[:,:,1])

#显示图像
plt.subplot(131), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.axis('off')
plt.subplot(132), plt.imshow(res1, 'gray'), plt.title('Fourier Image')
plt.axis('off')
plt.subplot(133), plt.imshow(res2, 'gray'), plt.title('Inverse Fourier Image')
plt.axis('off')
plt.show()

输出结果如图15-6所示,第一幅图为原始“Lena”图,第二幅图为傅里叶变换后的频谱图像,第三幅图为傅里叶逆变换,频谱图像转换为原始图像的过程。


六.总结

傅里叶变换的目的并不是为了观察图像的频率分布(至少不是最终目的),更多情况下是为了对频率进行过滤,通过修改频率以达到图像增强、图像去噪、边缘检测、特征提取、压缩加密等目的。下一篇文章,作者将结合傅里叶变换和傅里叶逆变换讲解它的应用。

时也,命也。
英语低分数线一分,些许遗憾,但不气馁,更加努力。雄关漫道真如铁,而今迈过从头越,从头越。苍山如海,残阳如血。感谢一路陪伴的人和自己。

无论成败,那段拼搏的日子都很美。结果只会让我更加努力,学好英语。下半年沉下心来好好做科研写文章,西藏之行,课程分享。同时,明天的博士考试加油,虽然裸泳,但也加油!还有春季招考开始准备。

最后补充马刺小石匠精神,当一切都看起来无济于事的时候,我去看一个石匠敲石头.他一连敲了100次,石头仍然纹丝不动。但他敲第101次的时候,石头裂为两半。可我知道,让石头裂开的不是那最后一击,而是前面的一百次敲击的结果。人生路漫漫,不可能一路一帆风顺,暂时的不顺只是磨练自己的必经之路,夜最深的时候也是距黎明最近的时刻,经历过漫漫长夜的打磨,你自身会更加强大。

最后希望这篇基础性文章对您有所帮助,如果有错误或不足之处,请海涵!

(By:Eastmount 2019-04-23 周二下午6点写于花溪 https://blog.csdn.net/Eastmount )

MATLAB图像处理

阅读数 6378

MATLAB图像变换

阅读数 3738