另外question人询问如何在使用cv2.dft
时获得幅度和相位谱的正确方法.
我的回答仅限于麻木的方法,然后我想使用OpenCV来做这件事会更好.我目前正试图重现相同的结果,但我看到了相位谱中的显著差异.
以下是我的进口商品:
%matplotlib notebook
import matplotlib.pyplot as plt
import numpy as np
import cv2
im = np.zeros((50, 50), dtype = np.float32) # create empty array
im[2:10, 2:10] = 255 # draw a rectangle
numpy示例和结果:
imFFTNumpy = np.fft.fft2(im)
imFFTNumpyShifted = np.fft.fftshift(imFFTNumpy)
magSpectrumNumpy = np.abs(imFFTNumpyShifted)
phaseSpectrumNumpy = np.angle(imFFTNumpyShifted)
fig, ax = plt.subplots(nrows = 1, ncols = 3)
ax[0].imshow(im)
ax[1].imshow(magSpectrumNumpy)
ax[2].imshow(phaseSpectrumNumpy)
plt.suptitle("Using Numpy np.fft.fft2 and np.abs/ np.angle")
OpenCV示例和结果:
imFFTOpenCV = cv2.dft(im, flags=cv2.DFT_COMPLEX_OUTPUT)
imFFTOpenCVShifted = np.fft.fftshift(imFFTOpenCV)
magSpectrumOpenCV, phaseSpectrumOpenCV = cv2.cartToPolar(imFFTOpenCVShifted[:,:,0], imFFTOpenCVShifted[:,:,1])
fig, ax = plt.subplots(nrows = 1, ncols = 3)
ax[0].imshow(im)
ax[1].imshow(magSpectrumOpenCV)
ax[2].imshow(phaseSpectrumOpenCV)
plt.suptitle("Using OpenCV cv2.dft and cv2.cartToPolar")
正如您所看到的,虽然幅度谱看起来相同(由于浮点运算,它有一些预期的偏差),但相位谱看起来有很大的不同.我深入研究了一下,发现OpenCV通常返回从0到2π的阶段,而np.angle
返回从-π到+π的阶段.不过,从opencv阶段减go π并不能纠正差异.
这可能是什么原因呢?有没有可能用这两种方法得到几乎相同的相位,就像震级一样?