# 使用Python numpy 进行二维傅里叶变换 和 图片自相关 *使用Python numpy库 进行求解图像的FFT 以及求解图片的自相关函数 图片的自相关函数(Auto correlation)* ```python #FFT: #使用 numpy.fft.fft2(正变换) 和numpy.fft.ifft2函数(反变换) #与Mxxxxx一样,需要np.fft.fftshift 和np.fft.ifftshift调整(相关文章一大堆) #(画图部分以及完整代码在下面) f = np.fft.fft2(image) fshift = np.fft.fftshift(f) ``` 求图片的自相关:网上的资料较少,先给出公式: ![1701619063655](image/matplotlib_subplot-2/1701619063655.png) 中间的圆圈和叉的组合符号是相关符号,使用[傅里叶](https://so.csdn.net/so/search?q=%E5%82%85%E9%87%8C%E5%8F%B6&spm=1001.2101.3001.7020)变换的卷积定理(相关定理)。 不同的教科书叫法不同,找一本图像处理的书都有讲到,下面截取自超星阅读中某一本数字图像处理的内容: ![1701619076535](image/matplotlib_subplot-2/1701619076535.png) 笔者只需要求自相关即可,所以上文中共轭相乘变成了求FT模的平方 下面是公式: ```python #Auto correlation: AC = np.fft.ifft2(np.abs(f) ** 2 ) AC = np.fft.fftshift(AC) ``` 完整代码如下: ```python import numpy as np import matplotlib.pyplot as plt from PIL import Image plt.rcParams['figure.dpi'] = 150 pic = Image.open('Lena.png').convert('L') image = np.asarray(pic) f = np.fft.fft2(image) fshift = np.fft.fftshift(f) iff = np.fft.ifft2(f) #AC = np.fft.ifft2(np.abs(f) ** 2 ) #AC = np.fft.ifftshift(AC) #上面两行与下面两行效果相同。 AC = np.fft.ifft2(np.abs(f) ** 2 ) AC = np.fft.fftshift(AC) plt.subplot(221) plt.imshow(image,cmap='gray') plt.title('Origin Image') plt.axis('off') plt.subplot(222) plt.imshow(abs(AC),cmap='hot') plt.title('AutoCorrelation') plt.axis('off') plt.show() plt.subplot(223) plt.imshow(20 * np.log(np.abs(fshift)),cmap='gray') plt.axis('off') plt.title('Fourier Transform') plt.subplot(224) plt.imshow(np.abs(iff),cmap='gray') plt.title('ifft2') plt.axis('off') plt.show() ``` 结果: ![1701619125851](image/matplotlib_subplot-2/1701619125851.png) ![1701619134303](image/matplotlib_subplot-2/1701619134303.png) 下面是需要注意的问题 1)对于求解的傅里叶频谱图像,在使用plt.imshow()的时候,展示的内容前面需要求 一个 `np.log` 不知道为什么缘故,有些博文中说,为了修改一下数据范围 (如果不加修改,我的程序结果是一个黑色的方块,感觉就是数据范围的锅) 。需要提醒的是仅仅在展示部分需要 `np.log` 对于后续处理还是用原矩阵,别粗心搞错。 2)`np.ifft2`后得到的也是一个 `复数矩阵`,就是截图的右下角 `ifft2`这张图,`plt.show()`时候,需要加上`np.abs()` 3)**关于自相关计算** 计算机编程中, `自相关=二维卷积`。甚至比如卷积层和卷积,其实求的也是自相关计算。关于这一点,如果你真的需要求解数学意义上的二维卷积,需要对矩阵进行上下颠倒+左右颠倒,也就是旋转180度,由于和本次记录无关,按下不表。 4) 求解自相关的时候对 f (傅里叶频谱图)求平方然后求反变换,为啥后面还要加一个fftshift(ifftshift)? 答: 不太清楚,猜测是一个数学问题 ,经过尝试我认为需要加fftshift这句话。 因为如果不加效果如图 ![1701619149597](image/matplotlib_subplot-2/1701619149597.png) 怎么看都不对把 -_-||