目录
1 傅里叶变换
1.1 基础理论
- 什么是时域,什么是频域? 知乎-傅里叶变换
-
相位 : 不是同时开始的一组余弦函数,在叠加时需要体现开始时间
-
注意问题
・对象是二值图像.所以需预先进行阈值分割,或者边缘检测
・寻找轮廓需要更改原始图像,因此需对原图做出拷贝
・OpenCV中,是从黑色背景中寻找白色对象.
1.2在numpy中实现傅里叶变换
1.2.1 傅里叶变换numpy.fft.fft2函数
- 实现傅里叶变换, 返回一个复数数组(complex ndarray)
其中,参数:
・image – 输入图像;
・mode – 轮廓的检索模式;
→cv2.RETR_EXTERNAL
只检测外轮廓
→cv2.RETR_LIST
检测的轮廓不建立等级关系
→cv2.RETR_CCOMP
建立两个等级的轮廓,上一层为外边界,内层为内孔的
1.2.2 边角到中心numpy.fft.fftshift函数
- 将零频率分量移到频谱中心
1.2.3 去掉负数20*np.log(np.abs(fshift))函数
- 返回的结果是双通道的(实部,虚部),映射到[0,255]区间才能展示
・先对频谱图像(fshift)计算绝对值, 求对数, 再*20
1.2.2 代码示例
- 代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("image\\lena.bmp",0)
f = np.fft.fft2(img)
fshift=np.fft.fftshift(f)
result=20*np.log(np.abs(fshift)
plt.subplot(121), plt.imshow(img,cmap='gray'),plt.title('original'),plt.axis('off')
plt.subplot(122), plt.imshow(result,cmap='gray'),plt.title('result'),plt.axis('off')
plt.show()
- 示例结果(原图,频谱图)
- 注意
・傅里叶变换得到低频,高频信息,分别做针对处理能实现不同目的;
・傅里叶变换是可逆的,图像经过傅里叶变换,逆傅里叶变换后,能恢复到原图;
・在频域对图像进行处理,会反映在逆变换图像上;
1.3 numpy实现逆傅里叶变换
- 对原始图像进行傅里叶变换得到的低频和高频进行处理,再恢复到原始图像上
- 低频: 主要是细节信息. 低通后的图像,因为去掉了高频的边界信息,会显得模糊
- 高频: 主要是边界信息. 高通后的图像,会保留边界,但丢失细节, 图像对比度也会变化
1.3.1 逆变换函数 numpy.fft.ifft2
- 实现傅里叶逆变换,得到一个复数数组
1.3.2 中心到边角 numpy.fft.ifftshift
- fftshift函数的逆函数
1.3.2 复数转换np.abs
- 同傅里叶变化时的转换
cv2.dft()。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("image\\lena.bmp",0)
f = np.fft.fft2(img)#傅里叶变换
fshift = np.fft.fftshift(f)#低频部分左上角移到中央
ishift = np.fft.ifftshift(fshift)#低频部分中央移到左上角
iimg = np.fft.ifft2(ishift)#逆傅里叶变换
iimg = np.abs(iimg)
plt.su