图像的正交变换在数字图像的处理与分析中起着很重要的作用,被广泛应用于图像增强、去噪、压缩编码等众多领域。本文手工实现了二维离散傅里叶变换和二维离散余弦变换算法,并在多个图像样本上进行测试,以探究二者的变换效果。

1. 傅里叶变换

实验原理

对一幅图像进行离散傅里叶变换(DFT),可以得到图像信号的傅里叶频谱。二维 DFT 的变换及逆变换公式如下:

DFT 尽管解决了频域离散化的问题,但运算量太大。从公式中可以看到,有两个嵌套的求和符号,显然直接计算的复杂度为 \(O(n^2)\) 。为了加快傅里叶变换的运算速度,后人提出快速傅里叶变换(FFT),即蝶形算法,将计算 DFT 的复杂度降低到了 \(O(n\log n)\)。

FFT 利用傅里叶变换的数学性质,采用分治的思想,将一个 \(N\) 点的 FFT,变成两个 \(N/2\) 点的 FFT。以一维 FFT 为例,可以表示如下:

其中,\(G(k)\) 是 \(x(k)\) 的偶数点的 \(N/2\) 点的 FFT,\(H(k)\) 是 \(x(k)\) 的奇数点的 \(N/2\) 点的 FFT。

这样,通过将原问题不断分解为两个一半规模的子问题,然后计算相应的蝶形运算单元,最终得以完成整个 FFT。

算法步骤

本次实验中,一维 FFT 采用递归实现,且仅支持长度为 2 的整数幂的情况。

算法步骤如下:

检查图像的尺寸,如果不是 2 的整数幂则直接退出。

对图像的灰度值进行归一化。

对图像的每一行执行一维 FFT,并保存为中间结果。

对上一步结果中的每一列执行一维 FFT,返回变换结果。

将零频分量移到频谱中心,并求绝对值进行可视化。

对中心化后的结果进行对数变换,以改善视觉效果。

主要代码

一维 FFT

def fft(x):

n = len(x)

if n == 2:

return [x[0] + x[1], x[0] - x[1]]

G = fft(x[::2])

H = fft(x[1::2])

W = np.exp(-2j * np.pi * np.arange(n//2) / n)

WH = W * H

X = np.concatenate([G + WH, G - WH])

return X

二维 FFT

def fft2(img):

h, w = img.shape

if ((h-1) & h) or ((w-1) & w):

print('Image size not a power of 2')

return img

img = normalize(img)

res = np.zeros([h, w], 'complex128')

for i in range(h):

res[i, :] = fft(img[i, :])

for j in range(w):

res[:, j] = fft(res[:, j])

return res

零频分量中心化

def fftshift(img):

# swap the first and third quadrants, and the second and fourth quadrants

h, w = img.shape

h_mid, w_mid = h//2, w//2

res = np.zeros([h, w], 'complex128')

res[:h_mid, :w_mid] = img[h_mid:, w_mid:]

res[:h_mid, w_mid:] = img[h_mid:, :w_mid]

res[h_mid:, :w_mid] = img[:h_mid, w_mid:]

res[h_mid:, w_mid:] = img[:h_mid, :w_mid]

return res

运行结果

2. 余弦变换

实验原理

当一个函数为偶函数时,其傅立叶变换的虚部为零,因而不需要计算,只计算余弦项变换,这就是余弦变换。离散余弦变换(DCT)的变换核为实数的余弦函数,因而计算速度比变换核为指数的 DFT 要快得多。

一维离散余弦变换与离散傅里叶变换具有相似性,对离散傅里叶变换进行下式的修改:

式中

由上式可见,\(\sum\limits_{x=0}^{2M-1}f_e(x)e^{\frac{-j2ux\pi}{2M}}\) 是 \(2M\) 个点的傅里叶变换,因此在做离散余弦变换时,可将其拓展为 \(2M\) 个点,然后对其做离散傅里叶变换,取傅里叶变换的实部就是所要的离散余弦变换。

算法步骤

基于上述原理,二维 DCT 的实现重用了上文中的一维 FFT 函数,并根据公式做了一些修改。

算法步骤如下:

检查图像的尺寸,如果不是 2 的整数幂则直接退出。

对图像的灰度值进行归一化。

对图像的每一行进行延拓,执行一维 FFT 后取实部,乘以公式中的系数,并保存为中间结果。

对上一步结果中的每一列进行延拓,执行一维 FFT 后取实部,乘以公式中的系数,返回变换结果。

对结果求绝对值,并进行对数变换,以改善视觉效果。

主要代码

二维 DCT

def dct2(img):

h, w = img.shape

if ((h-1) & h) or ((w-1) & w):

print('Image size not a power of 2')

return img

img = normalize(img)

res = np.zeros([h, w], 'complex128')

for i in range(h):

res[i, :] = fft(np.concatenate([img[i, :], np.zeros(w)]))[:w]

res[i, :] = np.real(res[i, :]) * np.sqrt(2 / w)

res[i, 0] /= np.sqrt(2)

for j in range(w):

res[:, j] = fft(np.concatenate([res[:, j], np.zeros(h)]))[:h]

res[:, j] = np.real(res[:, j]) * np.sqrt(2 / h)

res[0, j] /= np.sqrt(2)

return res

运行结果

文章来源: www.cnblogs.com,作者:TimDyh,版权归原作者所有,如需转载,请联系作者。

原文链接:https://www.cnblogs.com/timdyh/p/13338975.html

python实现傅里叶变换求幅值和相位_Python 实现图像快速傅里叶变换和离散余弦变换...相关推荐

  1. 利用python对图像进行傅里叶变换_Python 实现图像快速傅里叶变换和离散余弦变换...

    图像的正交变换在数字图像的处理与分析中起着很重要的作用,被广泛应用于图像增强.去噪.压缩编码等众多领域.本文手工实现了 二维离散傅里叶变换 和 二维离散余弦变换 算法,并在多个图像样本上进行测试,以探 ...

  2. 傅里叶变换的理解----计算幅值和相位

    先推荐表格文章  如果看了此文你还不懂傅里叶变换,那就过来掐死我吧[完整版] 傅里叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波或余弦信号的无限叠加. 1.FT的理论就会告诉你可以 ...

  3. 不用傅里叶变换,提取某一频率的幅值和相位

    不用傅里叶变换,提取某一频率的幅值和相位 摘要: 本文从实际工程问题入手,探寻解决办法,为引入信号正交分解,和广义傅里叶级数做铺垫. 转子做周期性旋转时,不平衡质量所产生的周期性惯性离心力会引起转子产 ...

  4. matlab 求电流幅值,输出信号的幅值与相位.ppt

    输出信号的幅值与相位 1.什么叫频率分析?2.频率分析的问题引入?3.频率分析的仿真.4.频率分析的计算方法.5.频率分析的作用与意义6.幅频特性与相频特性 王选择 1 频率分析的定义 1 频率分析的 ...

  5. matlab复数的相位,复数的幅值和相位

    [i]); x[i]=x[i]*180/PI-90; printf("第%d次谐波的相位为为%f \\n", i , x[i]) ; } printf("第%d次谐波的幅 ...

  6. 使用数字示波器DS6104测量交流信号的幅值和相位

    01简介 使用普通的万用表测量交流信号的时候,通常会遇到 万用表的频率响应 的问题.使用可以联网的示波器可以获得它采集到的数据,进而可以计算出所测量的交流信号的有效值和相位. 这里通过实验来确定使用示 ...

  7. Python 实现图像快速傅里叶变换和离散余弦变换

    图像的正交变换在数字图像的处理与分析中起着很重要的作用,被广泛应用于图像增强.去噪.压缩编码等众多领域.本文手工实现了二维离散傅里叶变换和二维离散余弦变换算法,并在多个图像样本上进行测试,以探究二者的 ...

  8. Matlab|数字图像处理02|图像的傅里叶变换(平移/旋转性质)及图像的离散余弦变换

    问题1:x,y方向同时平移后频谱有何变化? 答:经过平移后的傅里叶变换幅值图与原图像得到的傅里叶变换幅值图基本相同,平移不改变频谱的幅值. 代码运行结果: 代码: clc; clear all; I= ...

  9. 【matlab 图像处理】离散傅里叶变换离散余弦变换K-L变换小波变换

    [matlab 图像处理]离散傅里叶变换&离散余弦变换&K-L变换&小波变换 正交变换是信号处理的一种有效工具.图像信号不仅可以在空间域表示,也可以在频域表示,后者将有利于许多 ...

最新文章

  1. 开源一个SpringBoot + Mybatis + Vue的代码生成器
  2. json中怎么去掉[]外的引号_SEO优化中怎么做站内和站外的锚文本
  3. 中国最大的python社区-python最大数
  4. VTK:重采样折线用法实战
  5. Java中线程池,你真的会用吗?
  6. 飞鸽传书2007绿色版 唯一官方下载地址
  7. qq流浏览器网页版_如何使QQ浏览器浏览简洁
  8. js基础教程学习笔记
  9. 有哪些网站是django开发的_网站模板建设和定制开发哪个好,有哪些区别?
  10. java链接mysql原始方法_java连接mysql数据库的方法
  11. 2个表 遍历 组合_7.2 图的存储结构(2)
  12. java jpanel 叠加_java之JFrame、JPanel混合布局-Go语言中文社区
  13. php版密码字典生成 原创,真空密码字典生成器-使用教程和下载
  14. python模拟抛硬币_python模拟抛硬币
  15. win7电脑桌面便签哪个好用
  16. ispostback的坑
  17. 微软收购雅虎不如收购摩托罗拉
  18. 2016NOIP信息学竞赛提高组(北京)一等奖名单
  19. tp路由器 拨号失败 服务器无响应,tp路由器wdr8500拨号不成功怎么办
  20. 集成学习(Bagging和Boosting)

热门文章

  1. 拆解 | 某平台19元的儿童电话手表,究竟怎么做到的?
  2. 突发!百度CEO李彦宏被当中泼了一瓶水,肇事者网名:直男上树
  3. HDLBits答案(11)_Verilog计数器
  4. 自动增益(AGC)算法FPGA实现
  5. 计算机问题在线解答,2014年计算机专业复习疑难问题答疑
  6. 怎么绘制机械孔_机械制图中常用的图纸简化画法,相当适合初学者!
  7. 判断sem信号量为零_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
  8. native react 图片多选_react-native多图选择、图片裁剪(支持ad/ios图片个数控制)
  9. python自定义函数数据分析_Python实现自定义函数的5种常见形式分析
  10. python 基础之字符串方法