龙空技术网

OpenCV(32)——cv2实现傅里叶变换

小城测评 65

前言:

现时咱们对“numpy 傅立叶变换自己实现”大体比较注意,大家都想要知道一些“numpy 傅立叶变换自己实现”的相关知识。那么小编也在网络上汇集了一些关于“numpy 傅立叶变换自己实现””的相关知识,希望我们能喜欢,看官们快快来学习一下吧!

前言

在前一篇的博文中,我们详细讲解了傅里叶变换的原理以及使用Numpy库实现傅里叶变换。但是其实OpenCV有直接实现傅里叶变换的函数。

在OpenCV中,我们通过cv2.dft()来实现傅里叶变换,使用cv2.idft()来实现逆傅里叶变换。两个函数的定义如下:

cv2.dft(原始图像,转换标识)

这里的原始图像必须是np.float32格式。所以,我们首先需要使用cv2.float32()函数将图像转换。而转换标识的值通常为cv2.DFT_COMPLEX_OUTPUT,用来输出一个复数阵列。

经过cv2.dft()函数的变换后,我们会得到原始图像的频谱信息。此时零分量与Numpy库实现一样都不在中心位置。这里我们还是需要使用numpy.fft.fftshift()函数将其移动到中间位置。

需要特别注意的是,函数cv2.dft()返回值是双通道的,第1个通道是结果的实数部分,第2个通道是结果的虚数部分。使用numpy.fft.fftshift()函数处理后,频谱图像还只是一个由实部和虚部构成的值,要显示出来,要使用到另一个函数cv2.magnitude()。

该函数的定义如下:

cv2.magnitude(参数1,参数2)

参数1:浮点型x坐标值,也就是实部

参数2:浮点型y坐标值,也就是虚部,它必须和参数1具有相同的大小(size)

得到频谱图像的幅度之后,还需要将幅度映射到灰度空间[0,255]内,使其以灰度图像显示出来。与前篇博文一样,使用20*np.log(cv2.magnitude())。

实现傅里叶变换

下面,我们来通过上述OpenCV函数来实现傅里叶变换,并显示其频谱信息。

import cv2import numpy as npimport matplotlib.pyplot as pltimg = cv2.imread("4.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.axis('off')plt.subplot(122)plt.imshow(result, cmap="gray")plt.axis('off')plt.show()

运行之后,显示效果与前篇博文一样。

实现逆傅里叶变换

还是与上篇博文一样,这里我们过滤图像的频谱信息,这里我们过滤低频信息。

import cv2import numpy as npimport matplotlib.pyplot as pltimg = cv2.imread("4.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]))rows,cols=img.shaperows_half,cols_half=int(rows/2),int(cols/2)mask=np.zeros((rows,cols,2),dtype=np.uint8)mask[rows_half-30:rows_half+30,cols_half-30:cols_half+30]=1#逆傅里叶变换fShift=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.axis('off')plt.subplot(122)plt.imshow(iimg, cmap="gray")plt.axis('off')plt.show()

运行之后,效果如下:

可以看到过滤低频信息后,图像的边缘信息被消弱了。

标签: #numpy 傅立叶变换自己实现