hellou

opencv学习笔记(十一)

傅里叶变换:

作用:

  • 高频:变化剧烈的灰度分量,例如边界;
  • 低频:变化缓慢的灰度分量,例如大海

滤波:

  • 低通滤波器:只保留低频,会使图像模糊
  • 高通滤波器:只保留高频,会使图像细节增强

opencv中主要就是 cv2.dft() 和c v2.idft() ,输入图像需要先转换为np.floa32的格式;

得到的结果中,频率为0的部分会在左上角,通常需要转换到中心位置,可以通过shift变换来实现

cv2.dft() 返回的结果是双通道的(实部, 虚部),通常还要转换成图像格式才能展示(0,255)

复制代码
"""傅里叶变换

import cv2
from matplotlib import pyplot as plt
import numpy as np

def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread('C:/Users/hellou/Desktop/self-image.jpg',0)
img = cv2.resize(img,(600,600))

img_float32 = np.float32(img)

dft = cv2.dft(img_float32,flags=cv2.DFT_COMPLEX_OUTPUT)#执行傅里叶变换
# #将低频全部转换到中心位置,越高频越往外发散
#参数说明: img表示输入的图片, cv2.DFT_COMPLEX_OUTPUT表示进行傅里叶变化的方法
dft_shift = np.fft.fftshift(dft)
#得到灰度图能表示的形式
'''np.fft.fftshift(img)  将图像中的低频部分移动到图像的中心

参数说明:img表示输入的图片'''
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
#对两个通道进行转换,但转化完的结果是非常小的数值,所以通过上面的公式映射到0到255之间

plt.subplot(121),plt.imshow(img, cmap='gray')
plt.title('Input Image'),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'),plt.xticks([]),plt.yticks([])
plt.show()

""" cv2.magnitude(x, y) 将sqrt(x^2 + y^2) 计算矩阵维度的平方根

参数说明:需要进行x和y平方的数

    np.fft.ifftshift(img) # 进图像的低频和高频部分移动到图像原来的位置

参数说明:img表示输入的图片

    cv2.idft(img) # 进行傅里叶的逆变化

参数说明:img表示经过傅里叶变化后的图片"""
复制代码

 

posted on   云上u  阅读(15)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示