网站建设 h5 小程序,重庆建站模板厂家,WordPress内网外网访问,网站制作工资OpenCV入门#xff08;二十四#xff09;快速学会OpenCV 23 傅里叶变换1.傅里叶变换理论概述2.Numpy实现傅里叶变换2.1 傅里叶变换2.2 傅里叶逆变换2.3 高通滤波3.OpenCV实现傅里叶变换3.1 实现傅里叶变换3.2 实现傅里叶逆变换3.3 低通滤波作者#xff1a;Xiou
1.傅里叶变换…
OpenCV入门二十四快速学会OpenCV 23 傅里叶变换1.傅里叶变换理论概述2.Numpy实现傅里叶变换2.1 傅里叶变换2.2 傅里叶逆变换2.3 高通滤波3.OpenCV实现傅里叶变换3.1 实现傅里叶变换3.2 实现傅里叶逆变换3.3 低通滤波作者Xiou
1.傅里叶变换理论概述
图像处理一般分为空间域处理和频率域处理。空间域处理是直接对图像内的像素进行处理。空间域处理主要划分为灰度变换和空间滤波两种形式。灰度变换是对图像内的单个像素进行处理比如调节对比度和处理阈值等。空间滤波涉及图像质量的改变例如图像平滑处理。空间域处理的计算简单方便运算速度更快。
频率域处理是先将图像变换到频率域然后在频率域对图像进行处理最后再通过反变换将图像从频率域变换到空间域。傅里叶变换是应用最广泛的一种频域变换它能够将图像从空间域变换到频率域而逆傅里叶变换能够将频率域信息变换到空间域内。傅里叶变换在图像处理领域内有着非常重要的作用。
在图像处理过程中傅里叶变换就是将图像分解为正弦分量和余弦分量两部分即将图像从空间域转换到频率域以下简称频域。数字图像经过傅里叶变换后得到的频域值是复数。因此显示傅里叶变换的结果需要使用实数图像real image加虚数图像complex image或者幅度图像magnitude image加相位图像phase image的形式。
因为幅度图像包含了原图像中我们所需要的大部分信息所以在图像处理过程中通常仅使用幅度图像。当然如果希望先在频域内对图像进行处理再通过逆傅里叶变换得到修改后的空域图像就必须同时保留幅度图像和相位图像。对图像进行傅里叶变换后我们会得到图像中的低频和高频信息。
低频信息对应图像内变化缓慢的灰度分量。高频信息对应图像内变化越来越快的灰度分量是由灰度的尖锐过渡造成的。例如在一幅大草原的图像中有一头狮子低频信息就对应着广袤的颜色趋于一致的草原等细节信息而高频信息则对应着狮子的轮廓等各种边缘及噪声信息。
傅里叶变换的目的就是为了将图像从空域转换到频域并在频域内实现对图像内特定对象的处理然后再对经过处理的频域图像进行逆傅里叶变换得到空域图像。傅里叶变换在图像处理领域发挥着非常关键的作用可以实现图像增强、图像去噪、边缘检测、特征提取、图像压缩和加密等。
高频 vs 低频 高频 vs 低频:
高频: 变换剧烈的灰度分量, 例如边界。 低频: 变换缓慢的灰度分量, 例如一片大海。
滤波: 低通滤波器: 只保留低频, 会使得图像模糊。 高通滤波器: 只保留高频, 会使得图像细节增强。
傅里叶变化 (Fourier Transform) 是一种分析信号的方法. 傅里叶变化可分析信号的成分, 也可以用这些成分合成信号。 2.Numpy实现傅里叶变换
2.1 傅里叶变换
Numpy模块提供了傅里叶变换功能Numpy模块中的fft2()函数可以实现图像的傅里叶变换。本节介绍如何用Numpy模块实现图像的傅里叶变换以及在频域内过滤图像的低频信息保留高频信息实现高通滤波。
Numpy提供的实现傅里叶变换的函数是numpy.fft.fft2()它的语法格式是 返回值 numpy.fft.fft2(原始图像)这里需要注意的是参数“原始图像”的类型是灰度图像函数的返回值是一个复数数组complex ndarray。
经过该函数的处理就能得到图像的频谱信息。此时图像频谱中的零频率分量位于频谱图像频域图像[插图]的左上角为了便于观察通常会使用numpy.fft.fftshift()函数将零频率成分移动到频域图像的中心位置。如图所示 函数numpy.fft.fftshift()的语法格式是 返回值numpy.fft.fftshift(原始频谱)使用该函数处理后图像频谱中的零频率分量会被移到频域图像的中心位置对于观察傅里叶变换后频谱中的零频率部分非常有效。对图像进行傅里叶变换后得到的是一个复数数组。为了显示为图像需要将它们的值调整到[0,255]的灰度空间内使用的公式为 像素新值20*np.log(np.abs(频谱值))式中np是“numpy”的缩写来源于“import numpy as np”后面不再对此进行说明。
代码实例用Numpy实现傅里叶变换观察得到的频谱图像。
import cv2
import numpy as np
import matplotlib.pyplot as pltimg cv2.imread(girl1.jpg, 0)
f np.fft.fft2(img)
fshift np.fft.fftshift(f)
magnitude_spectrum 20 * np.log(np.abs(fshift))
plt.subplot(121)
plt.imshow(img, cmapgray)
plt.title(original)
plt.axis(off)
plt.subplot(122)
plt.imshow(magnitude_spectrum, cmapgray)
plt.title(result)
plt.axis(off)
plt.show()输出结果 2.2 傅里叶逆变换
需要注意的是如果在傅里叶变换过程中使用了numpy.fft.fftshift()函数移动零频率分量那么在逆傅里叶变换过程中需要先使用numpy.fft.ifftshift()函数将零频率分量移到原来的位置再进行逆傅里叶变换该过程如图 函数numpy.fft.ifftshift()是numpy.fft.fftshift()的逆函数其语法格式为 调整后的频谱 numpy.fft.ifftshift(原始频谱)numpy.fft.ifft2()函数可以实现逆傅里叶变换返回空域复数数组。它是numpy.fft.fft2()的逆函数该函数的语法格式为 返回值numpy.fft.ifft2(频域数据)函数numpy.fft.ifft2()的返回值仍旧是一个复数数组complex ndarray。逆傅里叶变换得到的空域信息是一个复数数组需要将该信息调整至[0, 255]灰度空间内使用的公式为 iimg np.abs(逆傅里叶变换结果)代码实例在Numpy内实现傅里叶变换、逆傅里叶变换观察逆傅里叶变换的结果图像。 import cv2import numpy as npimport matplotlib.pyplot as pltimg cv2.imread(girl1.jpg,0)f np.fft.fft2(img)fshift np.fft.fftshift(f)ishift np.fft.ifftshift(fshift)iimg np.fft.ifft2(ishift)#print(iimg)iimg np.abs(iimg)#print(iimg)plt.subplot(121), plt.imshow(img, cmap gray)plt.title(original), plt.axis(off)plt.subplot(122), plt.imshow(iimg, cmap gray)plt.title(iimg), plt.axis(off)plt.show()输出结果 2.3 高通滤波
在Numpy内对图像进行傅里叶变换得到其频域图像。然后在频域内将低频分量的值处理为0实现高通滤波。最后对图像进行逆傅里叶变换得到恢复的原始图像。观察傅里叶变换前后图像的差异。
代码实例 import cv2import numpy as npimport matplotlib.pyplot as pltimg cv2.imread(image\\boat.bmp,0)f np.fft.fft2(img)fshift np.fft.fftshift(f)rows, cols img.shapecrow, ccol int(rows/2) , int(cols/2)fshift[crow-30:crow30, ccol-30:ccol30] 0ishift np.fft.ifftshift(fshift)iimg np.fft.ifft2(ishift)iimg np.abs(iimg)plt.subplot(121), plt.imshow(img, cmap gray)plt.title(original), plt.axis(off)plt.subplot(122), plt.imshow(iimg, cmap gray)plt.title(iimg), plt.axis(off)plt.show()输出结果 3.OpenCV实现傅里叶变换
OpenCV提供了函数cv2.dft()和cv2.idft()来实现傅里叶变换和逆傅里叶变换下面分别展开介绍。
3.1 实现傅里叶变换
函数cv2.dft()的语法格式为
返回结果cv2.dft(原始图像转换标识)
代码实例用OpenCV函数对图像进行傅里叶变换并展示其频谱信息。 import numpy as npimport cv2import matplotlib.pyplot as pltimg cv2.imread(girl1.jpg,0)dft cv2.dft(np.float32(img), flags cv2.DFT_COMPLEX_OUTPUT)dftShift np.fft.fftshift(dft)result 20*np.log(cv2.magnitude(dftShift[:, :,0], dftShift[:, :,1]))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()输出结果
3.2 实现傅里叶逆变换
在OpenCV中使用函数cv2.idft()实现逆傅里叶变换该函数是傅里叶变换函数cv2.dft()的逆函数。其语法格式为 返回结果cv2.idft(原始数据)对图像进行傅里叶变换后通常会将零频率分量移至频谱图像的中心位置。如果使用函数numpy.fft.fftshift()移动了零频率分量那么在进行逆傅里叶变换前要使用函数numpy.fft.ifftshift()将零频率分量恢复到原来位置。
代码实例用OpenCV函数对图像进行傅里叶变换、逆傅里叶变换并展示原始图像及经过逆傅里叶变换后得到的图像。 import numpy as npimport cv2import matplotlib.pyplot as pltimg cv2.imread(girl1.jpg,0)dft cv2.dft(np.float32(img), flags cv2.DFT_COMPLEX_OUTPUT)dftShift np.fft.fftshift(dft)ishift np.fft.ifftshift(dftShift)iImg cv2.idft(ishift)iImg cv2.magnitude(iImg[:, :,0], iImg[:, :,1])plt.subplot(121), plt.imshow(img, cmap gray)plt.title(original), plt.axis(off)plt.subplot(122), plt.imshow(iImg, cmap gray)plt.title(inverse), plt.axis(off)plt.show()输出结果
3.3 低通滤波
前面讲过在一幅图像内低频信号对应图像内变化缓慢的灰度分量。例如在一幅大草原的图像中低频信号对应着颜色趋于一致的广袤草原。低通滤波器让高频信号衰减而让低频信号通过图像进行低通滤波后会变模糊。
代码实例使用函数cv2.dft()对图像进行傅里叶变换得到其频谱图像。然后在频域内将其高频分量的值处理为0实现低通滤波。最后对图像进行逆傅里叶变换得到恢复的原始图像。观察傅里叶变换前后图像的差异。 import numpy as npimport cv2import matplotlib.pyplot as pltimg cv2.imread(girl1.jpg,0)dft cv2.dft(np.float32(img), flags cv2.DFT_COMPLEX_OUTPUT)dftShift np.fft.fftshift(dft)rows, cols img.shapecrow, ccol int(rows/2) , int(cols/2)mask np.zeros((rows, cols,2), np.uint8)#两个通道与频域图像匹配mask[crow-30:crow30, ccol-30:ccol30] 1fShift dftShift*maskishift np.fft.ifftshift(fShift)iImg cv2.idft(ishift)iImg cv2.magnitude(iImg[:, :,0], iImg[:, :,1])plt.subplot(121), plt.imshow(img, cmap gray)plt.title(original), plt.axis(off)plt.subplot(122), plt.imshow(iImg, cmap gray)plt.title(inverse), plt.axis(off)plt.show()输出结果 运行上述代码得到如图所示的结果左图为原始图像右图为变换后的图像。可以看到经过低通滤波后图像的边缘信息被削弱了。