【发布时间】:2014-02-28 11:20:37
【问题描述】:
我有一个图像,我需要计算一个与傅立叶相关的变换,称为短时傅立叶变换(额外的数学信息检查:http://en.wikipedia.org/wiki/Short-time_Fourier_transform)。
为了做到这一点,我需要:
(1)在图像的起始像素处放置一个窗口(x,y)=(M/2,M/2)
(2) 使用此窗口截断图像
(3)计算截断图像的FFT,保存结果。
(4) 向右递增滑动窗口
(5) 转到第3步,直到窗口到达图像的末尾
但是我需要实时执行上述计算... 但是速度比较慢!!!
有没有办法加快上述过程??
我还包括我的代码:
height, width = final_frame.shape
M=2
for j in range(M/2, height-M/2):
for i in range(M/2, width-M/2):
face_win=final_frame[j-M/2:j+M/2, i-M/2:i+M/2]
#these steps are perfomed in order to speed up the FFT calculation process
height_win, width_win = face_win.shape
fftheight=cv2.getOptimalDFTSize(height_win)
fftwidth=cv2.getOptimalDFTSize(width_win)
right = fftwidth - width_win
bottom = fftheight - height_win
bordertype = cv2.BORDER_CONSTANT
nimg = cv2.copyMakeBorder(face_win,0,bottom,0,right,bordertype, value = 0)
dft = cv2.dft(np.float32(face_win),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
【问题讨论】:
-
我还没有答案,但我想自己分析一下,看看哪里可以改进并练习 numpy。但是,我在
magnitude_spectrum = ...行上得到RuntimeWarning: divide by zero encountered in log。这段代码可以吗,或者您可以在 imgur 上发布指向有效测试图像的链接吗? -
我也很确定是什么杀死了你正在复制
cv2.copyMakeBorder(...)中的数据。这是您复制数据的唯一地方,而且确实会复制大量数据。我会看看我是否能想出一个更有效的解决方案。 -
除非有人确切知道该做什么,否则这似乎需要一些讨论。你能加入this chat吗?
-
希望回答对您有所帮助。我还建议您在DSP Exchange 上发帖并指出这个问题以了解是否有人有更好的想法。他们可能对数学方法有更深入的了解,甚至可能为您优化代码。
标签: python opencv python-2.7 image-processing fft