图像相位谱有一个复杂的部分

问题描述 投票:0回答:1

我想查看手中图像的相位,但是在执行此操作时,我意识到图像的相位是 3 维的,因此 plt.implot 无法处理。聊天gpt说这是一个错误,因为它由复数组成,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)
python image-processing dft
1个回答
0
投票

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...

© www.soinside.com 2019 - 2024. All rights reserved.