opencv学习一: Fourier变换

来源:互联网 发布:慈溪行知职高地址全称 编辑:程序博客网 时间:2024/05/29 12:29

\Fourier变换在图像处理中意义重大。先将这几天学习的图像Fourier变换总结如下:

一:基础原理

  1. 什么是Fourier变换:

在数学和物理中,或者更准确一点,数学物理方法中,把一个任意函数进行fourier变换的意义等价于把一个函数进行以平面波为基的展开。这和3维下把一个矢量按照x,y,z基展开是一样的,这一点陳先生已经说明了。不但可以按平面波展开,还可以按照球面波展开。只要保证你选取的基是完全且正交的即可(应该属于泛函分析的范畴,要考虑你函数空间的性质,定义norm等)

作者:曾博链接:https://www.zhihu.com/question/19714540/answer/16020416来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。这是引用自勃勃的知乎上的一段解释。
  1. 将图像信号从空间域转换到复频域 —— 二维离散Fourier变换:

    F(u,v)=x=0M1y=0N1f(x,y)ej2π(uxM+vyN)

    其中:F(0,0)=M1x=0N1y=0f(x,y),也就是说,对于一幅灰度图像而言,F(0,0)指代的是图像空间域的平均灰度。

    将信号从复频域转换到空间域 —— 二维离散Fourier反变换:

    f(x,y)=1MNu=0M1v=0N1f(u,v)ej2π(uxM+vyN)

这两个公式是图像从空间域变换到频域的理论基础。随着FFT技术的发现,图像处理的运算量由O(n2)转变为O(nlogn)(其中n*n为图像的空间维度)。因此可知,图像处理的运算量被大大减小了。

3.Python与openCV实现图像信号的Fourier变换:

import cv2 #导入cv2包import numpy as np #导入numpy包import matplotlib.pyplot as plt img = cv2.imread('E:\\python_opencv\\img_source\\lena.jpg',0) #直接读为灰度图像img_fourier = np.fft.fft2(img) #Fourier变换fshift = np.fft.fftshift(img_fourier) #将占据信号大多数的低频信号移到图像中间img_fourier_mag = np.log(np.abs(fshift)) #取幅度值,并降低结果对比度(以e为底取对数)img_fourier_back = np.fft.ifftshift(fshift)#将占据信号大多数的低频信号转移回到图像边缘img_back = np.fft.ifft2(img_fourier_back)#Fourier反变换img_back = np.abs(img_back)figure = plt.figure()#原图像fig1 = figure.add_subplot(131)fig1.imshow(img,'gray')plt.title('original')#Fourier变换后的频域fig2 = figure.add_subplot(132)fig2.imshow(img_fourier_mag, 'gray')plt.title('Fourier_space')#Fourier反变换后的图像part3 = figure.add_subplot(133)part3.imshow(img_back,'gray')plt.title('img_back')plt.show()

显示结果为:
这里写图片描述

由频域转换结果可知,对于细节不是非常多的图像(例如上面的lena图像),低频信号才是最主要的。高频信号只是少数。

4.图像转换到频域到后,相位有什么作用?

import cv2 #导入cv2包import numpy as np #导入numpy包import matplotlib.pyplot as plt img = cv2.imread('E:\python_opencv\img_source\lena.jpg',0) #直接读为灰度图像img_fourier = np.fft.fft2(img) #Fourier变换fshift = np.fft.fftshift(img_fourier) #将占据信号大多数的低频信号移到图像中间img_fourier_mag = np.log(np.abs(fshift)) #取幅度值,并降低结果对比度(以e为底取对数)figure = plt.figure()f2shift = np.fft.ifftshift(np.angle(fshift))img_phase_back = np.fft.ifft2(f2shift)#出来的是复数,无法显示img_phase_back = np.abs(img_phase_back)np.savetxt('b.txt', img_phase_back)#调整大小范围便于显示img_phase_back = (img_phase_back-np.amin(img_phase_back))/(np.amax(img_phase_back)-np.amin(img_phase_back)) #归一化,防止对比度太低时显示效果不好np.savetxt('c.txt', img_phase_back)figure = plt.figure()fig1 = figure.add_subplot(111)fig1.imshow(img_phase_back,'gray')plt.title('phase')plt.show()

显示结果为:
这里写图片描述

从图像可以明显看出来,从相位还原出来的图像可以大致得到图像的轮廓。

原创粉丝点击