离散傅里叶变换在2D中的应用
2D DFT变换在数字图像处理中有着重要应用,本文记录相关概念和简单应用。
简介
- 傅里叶变换 是一种分析信号的方法, 将时域信号在频域的基中重新表示,而在频域中可能会有时域难以实现的操作效果。
- 对于数字图像处理来说,离散的 2D 傅里叶变换是更加实用的理论,根据傅里叶变换的性质 我们可以使用傅里叶变换进行时域的卷积、相关等操作
2D 傅里叶变换
1D 傅里叶变换是将时域信号用频域空间的基——不同频率的正弦、余弦波表示后的结果,那么 2D 傅里叶变换本质是什么呢
一维傅里叶变换
- 回顾一维傅里叶变换:
- 通俗来讲,一维傅里叶变换是将一个一维的信号分解成若干个复指数波 e^{j w x} 。而由于 e^{j w x}=\cos (w x)+i \sin (w x) ,所以可以将每一个复指数波 e^{j w x} 都视为是 余弦波 +\mathrm{j} {\times} 正弦波 的组合。
- 对于一个正弦波而言,需要三个参数来确定它:频率 w ,幅度 A ,相位 φ 。因此在频域中,一维坐标代表频率,而每个坐标对应的函数值也就是 F(w) 是一个复数,其中它的幅度 |F(w)| 就是这个频率正弦波的幅度 A ,相位 ∠F(w) 就是 φ 。下图右侧展现的只是幅度图,在信号处理中用到更多的也是幅度图。
- 一维傅里叶变换就是一个基变换,在时域中,基是一族中激信号 {\delta(x-n)} ,在频域中; 基是 \left\{e^{j w x}\right\} ,而且这组基是正交基。
类比:从一维到二维
一维信号是一个序列,傅里叶变换将其分解成若干个一维的简单函数之和。 二维的信号可以说是一个图像,类比一维,那二维傅里叶变换是不是将一个图像分解成若干个简单的图像呢?
- 事实上二维傅里叶变换将一个图像分解成若干个复平面波 e^{j 2 \pi(u x+v y)} 之和。
- 二维连续傅里叶变换的公式:
- 通过公式,我们可以计算出,每个平面波在图像中成分是多少。从公式也可以看到,二维傅里叶变换就是将图像与每个不同频率的不同方向的复平面波做内积,也就是一个求在基 \left\{e^{-j 2 \pi(u x+v y)}\right\} 上的投影的过程。 应该知道 \frac{\vec{a} \cdot \vec{b}}{|\vec{a}|} 是b在a上的投影,只不过这里的|a|的值被设 为 1 , 所以只有内积。
二维频域 K-SPACE (K空间)
- 对于正弦平面波,可以这样理解,在一个方向上存在一个正弦函数,在法线方向上将其拉伸。前面 说过三个参数可以确定一个一维的正弦波。哪几个参数可以确定一个二维的正弦平面波呢? 答案是 四个,其中三个和一维的情况一样 (频率 w , 幅度 A ,相位 \varphi ),但是具有相同这些参数的平面波 却可以有不同的方向 \vec{n} 。如下图所示:
- 类比一维中,幅度和相位可以用一个复数表示,它可以作为我们存储的内容。但是还有两个:一个频率一个方向。这时想到向量是有方向的,也是有长度的。所以我们用一个二维的矩阵的来保存分解之后得到的信息。这个矩阵就是K空间。(一般用k来表示空间频率)
- 就是说一个二维矩阵点 (u, v) 代表这个平面波的法向量 \vec{n} ,这个向量的模 \sqrt{u{2}+v{2}} 代表这个平面波的频率 w ,这个点里面保存的内容复数就是此平面波的幅度和相位。 下面这个图很好的体现了这一点:
- 也因比K空间的中心对于低频,周围对于高频。如下图,K空间中只有(0,0)处有值,也就是信号都是直流即不存在变化,所以实空间就是一张白纸。
- 中心低频贡献了图像的主体,周围高频提供图像的细节和边缘。
- k空间的每一个位置存储诸的数代表了所在位置复平面波在图像中占多少成分,我们就河以用每个系数 \times 所代表的平面波相加得到原来的图像。所以k空间和对应图像储存的信息含量是一样的,只不过表现形式不同,或者说基不同。
旋转和平移
- 如果旋转时域图像,由于旋转没有改变平面波的幅度相位,只是将所有的平面波都旋转了一个角度,那么频域图像也会旋转相应的角度。
- 平移时域图像,相当于周期信号没有变,仅是相位发生了变化,因此在频域中的表示是相位变化,而能量谱不变。
- 生成代码
123456789101112131415161718192021222324252627282930 |
import numpy as npimport mtutils as mtif __name__ == '__main__': golden_img = np.zeros([600, 600]) golden_img[250:350, 250:350] = 255 H, W = golden_img.shape[:2] gloden_fft = np.fft.fft2(golden_img) ori_fft_res = np.abs(np.fft.fftshift(gloden_fft)) rotate_img = mt.img_rotate(golden_img, 30) rotate_fft = np.fft.fft2(rotate_img) rotate_fft_res = np.abs(np.fft.fftshift(rotate_fft)) roi = [100, 100, W+100, H+100] moved_img = mt.crop_data_around_boxes(golden_img, roi) moved_fft = np.fft.fft2(moved_img) moved_fft_res = np.abs(np.fft.fftshift(moved_fft)) roi = [100, 100, W+100, H+100] moved_rotated_img = mt.crop_data_around_boxes(rotate_img, roi) moved_rotated_fft = np.fft.fft2(moved_rotated_img) moved_rotated_fft_res = np.abs(np.fft.fftshift(moved_rotated_fft)) mt.PIS(golden_img, rotate_img, moved_img, moved_rotated_img, ori_fft_res, rotate_fft_res, moved_fft_res, moved_rotated_fft_res, row_num=2) |
---|
去噪应用
一个大佬的PPT中提到了一个指纹去噪的傅里叶变换应用,很有意思
- 对于周期的背景信号,在频域空间中就会产生规律的亮点,如果将这些亮点去掉则可以起到去噪的效果
参考资料
- https://www.zhihu.com/question/22611929
- https://www.zywvvd.com/notes/study/math/fourier-transform/fourier-transform/
- https://www.zywvvd.com/notes/study/math/fourier-transform/fourier-conv/fourier-conv/
- https://www.sohu.com/a/233802622_224832
- https://zhuanlan.zhihu.com/p/19759362
- https://www.robots.ox.ac.uk/~az/lectures/ia/lect2.pdf
推荐阅读
-
重新描述循环矩阵在KCF中的应用
-
KCF跟踪算法在Python中的应用
-
Java 8新特性探究(十三)JavaFX 8新特性以及开发2048游戏-JavaFX历史## 跟java在服务器端和web端成绩相比,桌面一直是java的软肋,于是Sun公司在2008年推出JavaFX,弥补桌面软件的缺陷,请看下图JavaFX一路走过来的改进 从上图看出,一开始推出时候,开发者需使用一种名为JavaFX Script的静态的、声明式的编程语言来开发JavaFX应用程序。因为JavaFX Script将会被编译为Java bytecode,程序员可以使用Java代码代替。 JavaFX 2.0之后的版本摒弃了JavaFX Script语言,而作为一个Java API来使用。因此使用JavaFX平台实现的应用程序将直接通过标准Java代码来实现。 JavaFX 2.0 包含非常丰富的 UI 控件、图形和多媒体特性用于简化可视化应用的开发,WebView可直接在应用中嵌入网页;另外 2.0 版本允许使用 FXML 进行 UI 定义,这是一个脚本化基于 XML 的标识语言。 从JDK 7u6开始,JavaFx就与JDK捆绑在一起了,JavaFX团队称,下一个版本将是8.0,目前所有的工作都已经围绕8.0库进行。这是因为JavaFX将捆绑在Java 8中,因此该团队决定跳过几个版本号,迎头赶上Java 8。 ##JavaFx8的新特性 ## ###全新现代主题:Modena 新的Modena主题来替换原来的Caspian主题。不过在Application的start方法中,可以通过setUserAgentStylesheet(STYLESHEET_CASPIAN)来继续使用Caspian主题。 参考http://fxexperience.com/2013/03/modena-theme-update/ ###JavaFX 3D 在JavaFX8中提供了3D图像处理API,包括Shape3D (Box, Cylinder, MeshView, Sphere子类),SubScene, Material, PickResult, LightBase (AmbientLight 和PointLight子类),SceneAntialiasing等。Camera类也得到了更新。从JavaDoc中可以找到更多信息。 ###富文本 强化了富文本的支持 ###TreeTableView ###日期控件DatePicker 增加日期控件 ###用于 CSS 结构的公共 API
-
远程访问和虚拟化串口在Linux系统中的应用
-
重写的标题:小顶堆算法在堆排序中的应用
-
常见的JAVA API在算法竞赛中的应用:PriorityQueue(优先队列)
-
堆在java中的应用--PriorityQueue
-
橡皮筋界面在QT开发中的应用
-
移位操作函数的应用:circshift、fftshift和ifftshift在matlab中的用法
-
快速傅里叶变换在Python中的实现及其代码解析