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

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

二维 FFTdef 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 后取实部,乘以公式中的系数,返回变换结果。

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

主要代码

二维 DCTdef 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

运行结果

源码请参考扩展链接

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

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

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

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

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

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

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

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

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

  5. 数字图像处理学习笔记(十八)实现图像的离散余弦变换

    实验截图: 自带函数实现的离散余弦变换: 利用公式求出的DCT和IDCT 实验代码: 代码(1): img=imread('erciyuan.jpg'); img=rgb2gray(img); fig ...

  6. 数字图像处理与Python实现-离散余弦变换

    离散余弦变换 离散余弦变换 1. 前言 2.数学表达 3. 代码实现 1. 前言     离散余弦变换(DCT for Discrete Cosine Transform)是与傅里叶变换相关的一种变换 ...

  7. 图像处理之图像的离散余弦变换

    一.前言 离散余弦变换(Discrete Cosine Transform, DCT)是以一组不同频率和幅值的余弦函数和来近似一幅图像,实际上是傅立叶变换的实数部分.离散余弦变换有一个重要的性质,即对 ...

  8. python离散余弦变换_数字图像处理(三)—— 离散余弦变换

    离散余弦变换(Discrete Cosine Transform)本质上也是离散傅里叶变换(Discrete Fourier Transform),但是只有实数部分.有这样一个性质:如果信号 在给定区 ...

  9. 利用python对图像进行傅里叶变换_python实现图像傅里叶变换

    创作不易,如果对您有所帮助,请帮忙点赞,感谢! 一. 傅里叶变换简介: 在数字图像处理中,有两个经典的变换被广泛使用--傅里叶变换和霍夫变换.傅里叶变换是将时间域上的信号转变为频率域上的信号,进而进行 ...

最新文章

  1. 无限级分类实现思路 (组织树的分级管理)
  2. yolo 识别 狗狗自行车
  3. 需求获取安排计划书_创业型公司商业计划书PPT怎么写?才是投资人最想看的,免费领取...
  4. mybatis源码阅读(五) ---执行器Executor
  5. python并行计算numpy_【Nature文章摘录】NumPy: 从单机到分布式并行计算
  6. html中dom多会有影响吗,DOM操作造成的页面卡顿问题及解决
  7. 乔春洋:品牌管理创新
  8. C#常用类 改配置文件
  9. ruby 在 windows 中 新建进程 打开其他程序
  10. C++读取Json生成随机名字
  11. vue开源Element UI表单设计及代码生成器
  12. python 下载或者直接读取csv文件
  13. 数据网站(数据集的获取)、打分网站
  14. Linux网站搭建(3)---内网网站发布到外网(转)
  15. IO编程——文件复制操作
  16. JDK7升级到JDK8
  17. 【解决方案】scrapy报错KeyError: ‘Spider not found‘
  18. 4.智能快递柜(通信篇-SOCKET)
  19. python3爬虫有道翻译_【Python3爬虫】有道翻译
  20. 本地网络适配器里找不到虚拟机VMnet8

热门文章

  1. Python安装常见问题:ModuleNotFoundError: No module named ‘_ctypes‘ 解决办法
  2. 我们如何制作xkcd样式图?
  3. 安卓颜色标签android
  4. UUID生成唯一激活码
  5. (转)MTK_面试的几个主要问题 必看
  6. php网上商城拟解决的问题是,上次说的软件商城BUG,已找到问题,并解决~
  7. 二分求浮点数的平方根
  8. new关键字执行过程
  9. Mysql中有哪些数据类型(建议收藏)
  10. 获取当前时间以及模拟倒计时(Java)