小言_互联网的博客

在OpenCV里实现快速傅里叶变换

517人阅读  评论(0)

前面学习了傅里叶变换,没有对图像进行补齐的动作,因此计算的过程有可能是非快速计算过程,需要使用cv2.getOptimalDFTSize函数来计算补齐行数,这个函数定义如下:

vecsize参数是数组的大小。当数组是N = 2 ^p^ * 3 ^q^ * 5 ^r^的次方时,可以快速地计算。

下面的例子,使用此函数进行计算补充的行数:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import numpy as np
import cv2
from matplotlib import pyplot as plt

#快速傅里叶变换
def fftImg(src):
    h, w = src.shape[:2]
    # 获取优化的大小
    dft_M = cv2.getOptimalDFTSize(w)
    dft_N = cv2.getOptimalDFTSize(h)
    #拷贝到补充的数组
    dft_A = np.zeros((dft_N, dft_M, 2), dtype=np.float64)
    dft_A[:h, :w, 0] = src
    dft_A=cv2.dft(dft_A, flags = cv2.DFT_COMPLEX_OUTPUT, nonzeroRows=h)
    return dft_A

# 第一步读取图片
img = cv2.imread('dft3.jpg',0)

# 第二步: 使用cv2.dft进行傅里叶变换
dft = fftImg(img)

# 第三步:使用np.fft.shiftfft()将变化后的图像的低频转移到中心位置
dft_shift = np.fft.fftshift(dft)

# 第四步:使用cv2.magnitude将实部和虚部转换为实部
log_spectrum = np.log(1+cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))

# 第五步:归一化
cv2.normalize(log_spectrum, log_spectrum, 0.0, 1.0, cv2.NORM_MINMAX)
 
# 第六步:进行画图操作
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(log_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

结果输出如下:

https://blog.csdn.net/caimouse/article/details/51749579


转载:https://blog.csdn.net/caimouse/article/details/102465590
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场