首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >加速python (OpenCV)中与傅里叶相关的变换计算

加速python (OpenCV)中与傅里叶相关的变换计算
EN

Stack Overflow用户
提问于 2014-02-28 11:20:37
回答 1查看 1K关注 0票数 3

我有一个图像,我需要计算一个与傅立叶相关的变换,它被称为短时傅立叶变换(关于额外的数学信息,检查:transform)。

为了做到这一点,我需要:

(1)在图像(x,y)=(M/2,M/2)的起始像素处放置窗口

(2)使用此窗口截断图像

(3)计算截断图像的FFT,保存结果。

(4)将窗口逐步向右滑动

(5)进入步骤3,直到窗口到达图像的末尾

但是我需要实时地进行计算.但是它很慢!

是否有办法加快这一既定进程?

我还包括我的代码:

代码语言:javascript
运行
复制
        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]))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-28 14:17:18

当然,您的大部分时间将花在FFT和其他转换代码上,但我尝试对其他部分进行简单的优化。

变化

  • 帧大小计算是相同的每一个循环,所以把它们移出(~零改进)
  • 从uint8到float32的类型强制可以在整个图像上执行一次,而不是对每个帧进行转换。(微小但可衡量的改进)
  • 如果窗口大小已经与最佳大小相同(我猜如果你将M保持为2的幂),那么不要做边缘复制。只需按原样使用face_win视图即可。(微小但可衡量的改进)

全面改善26s -> 22s。不多,但它在那儿。

独立代码(只需添加1024x768.jpg)

代码语言:javascript
运行
复制
import time
import cv2
import numpy as np

# image loading for anybody else who wants to use this
final_frame = cv2.imread('1024x768.jpg')
final_frame = cv2.cvtColor(final_frame, cv2.COLOR_BGR2GRAY)
final_frame_f32 = final_frame.astype(np.float32)  # moved out of the loop

# base data
M = 4
height, width = final_frame.shape

# various calculations moved out of the loop
m_half = M//2
height_win, width_win = [2 * m_half] * 2  # can you even use odd values for M?
fftheight = cv2.getOptimalDFTSize(height_win)
fftwidth = cv2.getOptimalDFTSize(width_win)
bordertype = cv2.BORDER_CONSTANT
right = fftwidth - width_win
bottom = fftheight - height_win

start = time.time()
for j in range(m_half, height-m_half):
    for i in range(m_half, width-m_half):
        face_win = final_frame_f32[j-m_half:j+m_half, i-m_half:i+m_half]
        # only copy for border if necessary
        if (fftheight, fftwidth) == (height_win, width_win):
            nimg = face_win
        else:
            nimg = cv2.copyMakeBorder(face_win, 0, bottom, 0, right, bordertype, value=0)
        dft = cv2.dft(nimg, flags=cv2.DFT_COMPLEX_OUTPUT)
        dft_shift = np.fft.fftshift(dft)
        magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
elapsed = time.time() - start

print elapsed

错误

  • 我在上面的代码中修正了这些,但是我没有编辑你的原稿,因为你可能打算这样做。
  • 计算nimg,然后在dft中使用原始face_win。
  • 为了明确起见,我将M/2等更改为M//2
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22093740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档