• OpenCV实现图像傅里叶变换


    傅里叶变换

    dft=cv.dft(img_float32,flags=cv.DFT_COMPLEX_OUTPUT):

    flags:标志位,指定变换类型,cv.DFT_COMPLEX_OUTPUT会返回复数结果。

    傅立叶变换,将输入的图像从空间域转换到频率域。

    返回结果: 此函数返回一个复杂数值数组,即傅立叶变换的结果。

    对于每个像素位置,结果数组中包含两个值:一个实部和一个虚部,这两个值共同构成了一个复数。如果输入的图像是灰度图像,那么结果就是一个二维复数数组。如果输入的是彩色图像,那么结果就是三个二维复数数组(对应于RGB三个通道)。

    dft_shift=np.fft.fftshift(dft):

    傅立叶变换的结果进行中心移位。在傅立叶变换中,频率是按照从低到高的顺序排列的而在图像中,我们通常更关注中心部分的频率,因此需要将零频率分量(直流分量)移动到频谱的中央。此外,这个函数也用于将频率域的坐标移动到以中心为原点的参考点。

    magnitude_spectrum=20*np.log(cv.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))

    dft_shift[:,:,0] 和 dft_shift[:,:,1],这是两个来自前面傅立叶变换步骤的结果,分别代表了傅立叶变换后的实部和虚部计算傅立叶变换结果的幅度谱。20*np.log() 对这个幅度进行对数转换并乘以20,得到的结果就是振幅谱。

    1. import numpy as np
    2. import cv2 as cv
    3. import matplotlib.pyplot as plt
    4. img =cv.imread("../Lena.png",0)
    5. img_float32=np.float32(img)
    6. dft=cv.dft(img_float32,flags=cv.DFT_COMPLEX_OUTPUT)
    7. dft_shift=np.fft.fftshift(dft)
    8. magnitude_spectrum=20*np.log(cv.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
    9. plt.subplot(121)
    10. plt.imshow(img,cmap="gray")
    11. plt.title("Input Image")
    12. plt.xticks([]),plt.yticks([])
    13. plt.subplot(122)
    14. plt.imshow(magnitude_spectrum,cmap="gray")
    15. plt.title("Magnitude Spectrum")
    16. plt.xticks([]),plt.yticks([])
    17. plt.show()

    低通滤波和高斯滤波

    滤波:

    低通滤波器:保留低频,使图片模糊

    高通滤波器:保留高频,是图片细节增强

    低通滤波:

    1. import numpy as np
    2. import cv2 as cv
    3. import matplotlib.pyplot as plt
    4. img=cv.imread("../Lena.png",0)
    5. img_float=np.float32(img)
    6. dft=cv.dft(img_float,flags=cv.DFT_COMPLEX_OUTPUT)
    7. dft_shift=np.fft.fftshift(dft)
    8. rows,cols=img.shape
    9. crow,ccol=int(rows/2),int(cols/2) #中心位置
    10. #低通滤波
    11. mask=np.zeros((rows,cols,2),np.uint8)
    12. mask[crow-30:crow+30,ccol-30:ccol+30]=1
    13. #IDFT
    14. fshift=dft_shift*mask
    15. f_ishift=np.fft.ifftshift(fshift)
    16. img_back=cv.idft(f_ishift)
    17. img_back=cv.magnitude(img_back[:,:,0],img_back[:,:,1])
    18. plt.subplot(121)
    19. plt.imshow(img,cmap="gray")
    20. plt.title("Input Image")
    21. plt.xticks([]),plt.yticks([])
    22. plt.subplot(122)
    23. plt.imshow(img_back,cmap="gray")
    24. plt.title("Result")
    25. plt.xticks([]),plt.yticks([])
    26. plt.show()

     

    高通滤波

    1. import numpy as np
    2. import cv2 as cv
    3. import matplotlib.pyplot as plt
    4. img=cv.imread("../Lena.png",0)
    5. img_float=np.float32(img)
    6. dft=cv.dft(img_float,flags=cv.DFT_COMPLEX_OUTPUT)
    7. dft_shift=np.fft.fftshift(dft)
    8. rows,cols=img.shape
    9. crow,ccol=int(rows/2),int(cols/2) #中心位置
    10. #高通滤波
    11. mask=np.ones((rows,cols,2),np.uint8)
    12. mask[crow-30:crow+30,ccol-30:ccol+30]=0
    13. #IDFT
    14. fshift=dft_shift*mask
    15. f_ishift=np.fft.ifftshift(fshift)
    16. img_back=cv.idft(f_ishift)
    17. img_back=cv.magnitude(img_back[:,:,0],img_back[:,:,1])
    18. plt.subplot(121)
    19. plt.imshow(img,cmap="gray")
    20. plt.title("Input Image")
    21. plt.xticks([]),plt.yticks([])
    22. plt.subplot(122)
    23. plt.imshow(img_back,cmap="gray")
    24. plt.title("Result")
    25. plt.xticks([]),plt.yticks([])
    26. plt.show()

     

  • 相关阅读:
    2023-9-14 最长上升子序列
    聊聊 golang 中 channel
    2023年最新软件安装管家目录
    mall :hutool项目源码解析
    智能座舱概述
    代码随想录训练营二刷 总结 | 完结撒花
    【柳工智慧矿山】隐私政策
    深入理解强化学习——强化学习智能体的四要素:模型(Model)
    华为李鹏:到 2025 年智能算力需求将达到目前水平的 100 倍
    el-tabs(标签栏)的入门学习
  • 原文地址:https://blog.csdn.net/m0_46306264/article/details/133764376