频域滤波——(FFT_By_Numpy)numpy实现图像的二维离散傅里叶变换

图像的二维离散傅里叶变换和傅里叶逆变换代码实现

import numpy as np
import matplotlib.pyplot as plt
import cv2
## 二维图像的离散傅里叶变换,numpy实现
#numpy提供了 re = numpy.fft.fft2(原始图像),返回值是一个复数数组;经过该函数处理可以得到图像的频谱;
#但是该频谱图中图像的低频部分(对应灰度变换缓慢的部分)在频谱的四个角,
# 常使用numpy.fft.fftshift()函数将零频率成分移动到频域图像的中心位置
#傅里叶变换得到的是复数数组,要想显示频谱图,需要计算复数的模(实部虚部平方和的正平方根)得到频谱图
#另外由于图像处理前通常先归一化,为正常显示频谱图,会将频谱值映射到[0,255]范围内: 像素新值=20*np.log(np.abs(频谱值))
#归一化处理:将所有元素范围归到0-1之间
normalize=lambda x:(x-x.min())/(x.max()-x.min()+1e-6)
#傅里叶逆变换:
#1、读取图像
#img=cv2.imread("./images/CH04/woman.tif",flags=0)
img=cv2.imread("./images/CH04/rectangle.tif",flags=0)
#cv2.imshow("a",img)
#cv2.waitKey() 
#print(img)
#2、归一化函数定义:通常在做图像处理时会把像素值范围处理到(0,1)
#3、对图像进行离散傅里叶变换
img_fft=np.fft.fft2(img) #返回一个复数数组
#print(img_fft)
#计算傅里叶变换的频谱和相位
ampSpectrum1=np.abs(img_fft) #使用numpy自带的求复数模的方法求频谱,值比较大,会上万
#ampSpectrum2 = np.sqrt(np.power(img_fft.real, 2) + np.power(img_fft.imag, 2)) #按照求复数模的方法,运用numpy数学运算计算
phase=np.angle(img_fft)
ampSpectrum1Norm=np.uint8(normalize(ampSpectrum1)*255)
print("phase:",phase)
#print("ampSpectrum1:", ampSpectrum1)
#print("ampSpectrum max={}, min={}".format(ampSpectrum1.max(), ampSpectrum1.min())) # 输出:ampSpectrum max=16301359.0, min=3.1418796410737735
#print("ampSpectrum2:", ampSpectrum2)
#4、将低频移至中心位置,求频谱,将频谱值归到(0.255)范围
img_fft_shift=np.fft.fftshift(img_fft)
ampSpecShift=np.abs(img_fft_shift)
#np.uint8()函数是NumPy库中的一个函数,用于将数据类型转换为8位无符号整数类型。
ampSpecShiftNorm=np.uint8(normalize(ampSpecShift)*255) 
#上述频谱由于灰度太低,很难看清,经过对数变换,再归到(0,255)范围
ampSpectrum1Log=np.log(1 + ampSpectrum1Norm)
ampSpectrum1LogNorm=np.uint8(normalize(ampSpectrum1Log)*255)
ampSpecShiftLog=np.log(1 + ampSpecShiftNorm)
ampSpecShiftLogNorm=np.uint8(normalize(ampSpecShiftLog)*255)
#5、傅里叶逆变换:numpy提供np.fft.ifft2()实现傅里叶逆变换,np.fft.ifftshift()将低频在转回四个角上
img_ifft=np.fft.ifft2(img_fft) #返回的也是一个复数数组
ampSpecIfft=np.abs(img_ifft)
#ampSpecIfftNorm=np.uint8(normalize(ampSpecIfft)*255)
plt.figure(figsize=(9, 6))
#显示原图
plt.subplot(231), plt.title("origin"), plt.imshow(img)
#显示fft后的频谱图 
plt.subplot(232),plt.title("fftAmSpec"),plt.imshow(ampSpectrum1Norm,cmap="gray")
#显示低频中心话后的频谱图
plt.subplot(233),plt.title("fftAmSpecShift"),plt.imshow(ampSpecShiftNorm,cmap="gray")
#显示fft后的频谱在经过对数变换后的图 
plt.subplot(234),plt.title("fftAmSpecLog"),plt.imshow(ampSpectrum1LogNorm,cmap="gray")
#显示低频中心话后的频谱在经过对数变换后的图 
plt.subplot(235),plt.title("fftAmSpecShiftLog"),plt.imshow(ampSpecShiftLogNorm,cmap="gray")
#显示傅里叶逆变换的
plt.subplot(236),plt.title("ampSpecIfft"),plt.imshow(ampSpecIfft,cmap="gray")
plt.tight_layout()
plt.show()

运行效果如下:
(1,1)是原始图像,(1,2)经过傅里叶变换后的频谱图,(1,3)将傅里叶变换后的频谱中低频中心话后的图像
(2,1)是将(1,2)的频谱经过对数变换后的频谱图,(2,2)是将(1,3)中的频谱经过对数变换后的频谱图
(3,3)是对(1,2)进行傅里叶逆变换后的频谱图。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值