持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情
说到傅里叶变换,那需要先说一下傅里叶级数,这两个概念容易混淆,但是有区别。傅里叶级数用于周期性函数。傅里叶级数的公式如下
对于上述公式,从基本周期为T的周期函数给g(t)开始,将其拆分为余弦和正弦两个部分,且两个三角函数都是加权的,也就是每一个函数都有一个系数。
简单说了一下傅里叶级数,下面就来区分一下傅里叶变换,傅里叶变换的结果是一个频域函数。时域和频域是两个概念,也就是傅里叶变换中涉及的两个概念。时域很好理解,时就是时间,我们生活的三维空间内,所有的物体都在随时间的变化而变化,可以理解为所有的物体都在相对运动。然后频域就没有时域那么直观的好理解一些,下面先看一张图
在左边,我们看到的是不断起伏的叠加线条,而在右手边,神奇的一幕出现了,我们看到的居然是静止的!!!,体会不到没关系,试想一下,每个波峰从我们放眼望去的方向由低到高逐渐排列,我们看到的是一个个线条,类似于下图这样
这样即使左手边看到一直是动的线条,而在右手边看到的确实静止的线条了,每个蓝的顶部就是波峰。说了这么多有什么意义呢? 有时候对一些信号进行分析的时候,时域下每个参数都一样需要进一步分析信号的频率结构,并在频率域中对信号进行描述,但是实际上由于频率、相位等相关因素的影响,两个信号并非完全相同,需要进一步分析信号的频率结构,并在频率域中对信号进行描述。
说了那么多,那么既然我们是做图像的,那就不要扯什么信号了,直接拿图像说事,看如何将一张二维的图像进行傅里叶变换,下面先把公式列上。
其中f(x,y)就是大小为MxN的图像,u和v是在u=0,1,2,...M-1,v=0,1,2...N-1范围内的离散变量。
代码如下
import numpy as np
import cv2
def DET(image):
if len(image.shape) > 2:
image_gary = 0.2126 * image[:, :, 0] + 0.7152 * image[:, :, 1] + 0.0722 * image[:, :, 2]
w, h = image_gary.shape
# 生成一个复数矩阵保存处理的结果值
D = np.zeros([w, h], np.complex64)
for u in range(w):
for v in range(h):
rest = 0
for x in range(w):
for y in range(h):
rest = image_gary[x, y] * np.exp(-1j * 2 * np.pi * (u * x / w + v * y / h))
D[u, v] = rest
return D
image = cv2.imread("./de.PNG")[: 30, : 30]
image_gray = DET(image)
dft_img = np.log(1+np.abs(image_gray))
cv2.imshow("test", dft_img)
cv2.waitKey(0)
代码只是复刻上述代码,可以看到代码中进行了四次循环,这个计算量还是非同小可的,使用了一个1920x1080的图像,跑了好久电脑每跑出来,我就停止了。。。。
结果中中间的3表示三通道图像,在处理过程中转换为灰度图了