上一章中学习了一维离散傅里叶变换的概念和实现。但在具体的图像中实现还是有点不足,首先我们需要输入图像的尺寸都是2的整数次幂,这个条件太过苛刻了,如果使用Resize又会损失信息。目前还是以熟悉为主,所以选择用numpy自带的方法来进行频域的转换。
那么很简单的,首要就是试一下把一张图片从空间域转换到频域上,然后在频域上分解成幅度谱和相位谱,然后再反过来利用幅度谱和相位谱合成一张图片。实现的代码如下,主要是使用numpy自带的函数,numpy.abs计算复数的绝对值,numpy.angle计算相位值。
from PIL import Image
import numpy as np
girl = "C:/Users/60214/Desktop/python_work/DigitalExecution/gray_girl.jpg"
newgirl = "C:/Users/60214/Desktop/python_work/DigitalExecution/newgirl.jpg"
im = Image.open(girl)
im_arr = np.array(im)
fft = np.fft.fft2(im_arr)
phase = np.angle(fft)
amplitude = np.abs(fft)
new_fft = np.zeros(amplitude.shape, dtype = "complex64")
for i in range(new_fft.shape[0]):
for j in range(new_fft.shape[1]):
new_fft[i, j] = amplitude[i, j] * np.exp(complex(0, phase[i, j]))
new_fft = np.fft.ifft2(new_fft)
new_fft = np.abs(new_fft)
new_arr = np.zeros(new_fft.shape, dtype = "uint8")
for i in range(new_fft.shape[0]):
for j in range(new_fft.shape[1]):
new_arr[i, j] = new_fft[i, j]
new_im = Image.fromarray(new_arr)
new_im.save(newgirl)
然后可以做一个有趣的实验,即把两张图片转换后的幅度谱和相位谱交换,看生成的新图片是什么样子的,可以帮助我们更好的理解幅度谱和相位谱到底代表了图片在时域上的什么内容。
from PIL import Image
import numpy as np
man = "C:/Users/60214/Desktop/python_work/DigitalExecution/gray_man.jpg"
woman = "C:/Users/60214/Desktop/python_work/DigitalExecution/gray_woman.jpg"
a = Image.open(man)
a = a.resize((800, 800))
a = np.array(a)
a = np.fft.fft2(a