微信浏览为网站的缓存怎么清理,建设银行信用卡网站登录,石景山做网站公司,怎么样制作网站教程理论
傅立叶变换用于分析各种滤波器的频率特性。对于图像#xff0c;使用 2D离散傅里叶变换#xff08;DFT#xff09; 查找频域。快速算法称为 快速傅立叶变换#xff08;FFT#xff09; 用于计算DFT。
Numpy中的傅立叶变换
首先#xff0c;我们将看到如何使用Numpy查…理论
傅立叶变换用于分析各种滤波器的频率特性。对于图像使用 2D离散傅里叶变换DFT 查找频域。快速算法称为 快速傅立叶变换FFT 用于计算DFT。
Numpy中的傅立叶变换
首先我们将看到如何使用Numpy查找傅立叶变换。Numpy具有FFT软件包来执行此操作。np.fft.fft2() 为我们提供了频率转换它将是一个复杂的数组。它的第一个参数是输入图像即灰度图像。第二个参数是可选的它决定输出数组的大小。如果它大于输入图像的大小则在计算FFT之前用零填充输入图像。如果小于输入图像将裁切输入图像。如果未传递任何参数则输出数组的大小将与输入的大小相同。
现在一旦获得结果零频率分量DC分量将位于左上角。如果要使其居中只需通过函数 np.fft.fftshift() 即可完成。它更容易分析。找到频率变换后就可以找到幅度谱。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img cv.imread(messi5.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, cmap gray)
plt.title(Input Image), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap gray)
plt.title(Magnitude Spectrum), plt.xticks([]), plt.yticks([])
plt.show()结果如下 可以在中心看到更多白色区域这表明低频内容更多。
因此您已经进行了频率变换您可以在频域中执行一些操作例如高通滤波和重建图像若进行逆DFT。为此您需用尺寸为60x60的矩形窗口遮罩来消除低频。然后使用 np.fft.ifftshift() 应用反向移位以使DC分量再次出现在左上角。然后使用 np.ifft2() 函数找到逆FFT 。同样结果将是一个复数。
rows, cols img.shape
crow,ccol rows//2 , cols//2
fshift[crow-30:crow31, ccol-30:ccol31] 0
f_ishift np.fft.ifftshift(fshift)
img_back np.fft.ifft2(f_ishift)
img_back np.real(img_back)
plt.subplot(131),plt.imshow(img, cmap gray)
plt.title(Input Image), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(img_back, cmap gray)
plt.title(Image after HPF), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(img_back)
plt.title(Result in JET), plt.xticks([]), plt.yticks([])
plt.show()结果如下 结果表明高通滤波是边缘检测操作。
如果您仔细观察结果尤其是最后一张JET颜色的图像您会看到一些伪像我用红色箭头标记的一个实例。它在那里显示出一些波纹状结构称为 振铃效应 。这是由我们用于遮罩的矩形窗口引起的。此蒙版转换为正弦形状从而导致此问题。因此矩形窗口不用于过滤。更好的选择是高斯窗口。
OpenCV中的傅立叶变换
OpenCV 为此提供了功能 cv.dft() 和 cv.idft() 。它返回与以前相同的结果但是有两个通道。第一个通道将具有结果的实部第二个通道将具有结果的虚部。输入的图像应首先转换为np.float32 。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img cv.imread(messi5.jpg,0)
dft cv.dft(np.float32(img),flags cv.DFT_COMPLEX_OUTPUT)
dft_shift np.fft.fftshift(dft)
magnitude_spectrum 20*np.log(cv.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
plt.subplot(121),plt.imshow(img, cmap gray)
plt.title(Input Image), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap gray)
plt.title(Magnitude Spectrum), plt.xticks([]), plt.yticks([])
plt.show()注意 还可以使用 cv.cartToPolar() 一次返回大小和相位 因此现在我们必须进行逆DFT。在上一部分中我们创建了一个HPF这次我们将看到如何去除图像中的高频内容即我们将LPF应用于图像。实际上会使图像模糊。为此我们首先创建一个在低频时具有高值1的蒙版即我们传递LF含量并在HF区域传递0。
rows, cols img.shape
crow,ccol rows/2 , cols/2
# create a mask first, center square is 1, remaining all zeros
mask np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow30, ccol-30:ccol30] 1
# apply mask and inverse DFT
fshift dft_shift*mask
f_ishift np.fft.ifftshift(fshift)
img_back cv.idft(f_ishift)
img_back cv.magnitude(img_back[:,:,0],img_back[:,:,1])
plt.subplot(121),plt.imshow(img, cmap gray)
plt.title(Input Image), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img_back, cmap gray)
plt.title(Magnitude Spectrum), plt.xticks([]), plt.yticks([])
plt.show()查看结果 注意 像往常一样OpenCV函数 cv.dft() 和 cv.idft() 比Numpy对应函数要快。但是Numpy功能更加人性化。 DFT的性能优化
对于某些阵列大小DFT计算的性能更好。当阵列大小为2的幂时它是最快的。大小为2、3和5的乘积的数组也得到了有效处理。因此如果您担心代码的性能可以在找到DFT之前将数组的大小修改为任何最佳大小通过填充零。对于OpenCV您必须手动填充零。但是对于Numpy您可以指定FFT计算的新大小它将自动为您填充零。
那么我们如何找到这个最佳尺寸呢OpenCV 为此提供了一个函数 cv.getOptimalDFTSize() 。它适用于 cv.dft() 和 np.fft.fft2() 。让我们使用IPython magic命令timeit检查它们的性能。
In [16]: img cv.imread(messi5.jpg,0)
In [17]: rows,cols img.shape
In [18]: print({} {}.format(rows,cols))
342 548
In [19]: nrows cv.getOptimalDFTSize(rows)
In [20]: ncols cv.getOptimalDFTSize(cols)
In [21]: print({} {}.format(nrows,ncols))
360 576参见将大小342,548修改为360576。现在让我们用零填充对于OpenCV并找到其DFT计算性能。您可以通过创建一个新的大零数组并将数据复制到其中来完成此操作或者使用 cv.copyMakeBorder() 。
nimg np.zeros((nrows,ncols))
nimg[:rows,:cols] img要么
right ncols - cols
bottom nrows - rows
bordertype cv.BORDER_CONSTANT #just to avoid line breakup in PDF file
nimg cv.copyMakeBorder(img,0,bottom,0,right,bordertype, value 0)现在我们计算Numpy函数的DFT性能比较
In [22]: %timeit fft1 np.fft.fft2(img)
10 loops, best of 3: 40.9 ms per loop
In [23]: %timeit fft2 np.fft.fft2(img,[nrows,ncols])
100 loops, best of 3: 10.4 ms per loop它显示了4倍的加速。现在我们将尝试使用OpenCV函数。
In [24]: %timeit dft1 cv.dft(np.float32(img),flagscv.DFT_COMPLEX_OUTPUT)
100 loops, best of 3: 13.5 ms per loop
In [27]: %timeit dft2 cv.dft(np.float32(nimg),flagscv.DFT_COMPLEX_OUTPUT)
100 loops, best of 3: 3.11 ms per loop它还显示了4倍的加速。可以看到OpenCV函数比Numpy函数快3倍左右。
apachecn.github.io/opencv-doc-zh/#/