图像相位谱为何有复数部分
我想查看我手中图像的相位,但在这个过程中,我发现图像的相位是三维的,所以 plt.implot 这个函数无法处理。ChatGPT 说这是一个错误,因为它包含了复数,phase_spectrum 的大小是 (1640, 1080, 2)。
image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
value_channel_float = np.float32(value_channel)
dft = cv2.dft(np.float32(value_channel_float), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1]))
phase_spectrum = np.angle(dft_shift)
1 个回答
2
cv2.dft
的输出是一个二维矩阵,里面有两个通道:一个是实数部分,一个是虚数部分。不过,这两个通道都是浮点数,并不是像我们想象的那样一个是真实的,一个是虚构的。所以,最好使用下面的方法:
%matplotlib notebook
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LogNorm
im = np.zeros((1000, 1000)) # create empty array
im[200:800, 200:800] = 255 # draw a rectangle
imFFT = np.fft.fft2(im) # take FFT
imFFTShifted = np.fft.fftshift(imFFT) # shift to centre
magSpectrum = np.abs(imFFTShifted) # this is how you calculate the magSpectrum
phaseSpectrum = np.angle(imFFTShifted) # this is the phaseSpectrum
fig, ax = plt.subplots(nrows = 1, ncols = 3)
ax[0].imshow(im)
ax[1].imshow(magSpectrum, norm = LogNorm())
ax[2].imshow(phaseSpectrum, norm = LogNorm())
这里有个示例,展示如何处理这个:
imFFTOpenCV = cv2.dft(im, flags=cv2.DFT_COMPLEX_OUTPUT)
imFFTNumpy = np.fft.fft2(im)
print("Data type of imFFTOpenCV: "+str(imFFTOpenCV.dtype))
print("Data type of imFFTNumpy: "+str(imFFTNumpy.dtype))
结果:
Data type of imFFTOpenCV: float64
Data type of imFFTNumpy: complex128
在进行通常的快速傅里叶变换(FFT)计算之前,你需要先用cv2调整一下FFT。我建议直接使用numpy来处理...