Anaconda+python 进行FFT算法

在Anaconda +python下进行FFT算法实习及其逆算法,BJUT数字与图像处理作业一

1) 将宽为2n的正方形图像,用FFT算法从空域变换到频域,并用频域图像的模来进行显示。

2) 使图像能量中心,对应到几何中心,并用频域图像的模来进行显示。

3)将频域图象,通过FFT逆变换到空域,并显示。



#FFT.py
import numpy as np
from skimage import data
from matplotlib import pyplot as plt
#中文字体设置
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14) #新宋体
#滤波器设计
from scipy import signal
b,a = signal.butter(3,0.08,'low')
#图片读取
img1=data.chelsea()
img_salt1=data.chelsea()


#灰度处理
def rgb2gray(rgb):
    return np.dot(rgb[...,:3], [0.299, 0.587, 0.144])
img = rgb2gray(img1)
img_salt = rgb2gray(img_salt1)


#随机生成5000个椒盐
rows,cols=img_salt.shape
for i in range(5000):
   x=np.random.randint(0,rows)
   y=np.random.randint(0,cols)
   img_salt[x,y]=255
#图片 FFT 变换
img_fft=np.fft.fft2(img)
img_fft_abs=np.log(np.abs(np.fft.fftshift(img_fft)))
#图片 IFFT 处理结果
img_ifft=np.fft.ifft2(img_fft)#图片加噪


#图片加噪 FFT 变换
img_salt_fft=np.fft.fft2(img_salt)
img_salt_fft_abs=np.log(np.abs(np.fft.fftshift(img_salt_fft)))
#加噪图片巴特沃斯滤波
img_salt_butter = signal.filtfilt(b,a,img)
#巴特沃斯滤波器处理后频谱
img_salt_butter_fft=np.fft.fft2(img_salt_butter)
img_salt_butter_fft_abs=np.log(np.abs(np.fft.fftshift(img_salt_butter_fft)))
#IFFT 处理后图像
img_butter_ifft=np.fft.ifft2(img_salt_butter_fft).real
#IFFT 得到的图片频谱
img_butter_ifft_fft=np.fft.fft2(img_butter_ifft)


fig1 = plt.figure()
plt.imshow(img ,'gray'),plt.title('源图',fontproperties=font)
fig5 = plt.figure()
plt.imshow(img_fft_abs , 'gray'), plt.title('源图频谱',fontproperties=font) 
fig8 = plt.figure()
plt.imshow(img_salt , 'gray'), plt.title('源图加噪',fontproperties=font)
fig2 = plt.figure()
plt.imshow(img_salt_fft_abs , 'gray'), plt.title('源图加噪后频谱',fontproperties=font)
fig3 = plt.figure()
plt.imshow(img_salt_butter , 'gray'), plt.title('巴特沃斯滤波器处理后图像',fontproperties=font)
fig4 = plt.figure()
plt.imshow(img_salt_butter_fft_abs, 'gray'), plt.title('处理后图像频谱',fontproperties=font)
fig6 = plt.figure()
plt.imshow(img_butter_ifft , 'gray'), plt.title('巴特沃斯处理后频谱 IFFT',fontproperties=font)
fig7 = plt.figure()
plt.imshow(img_fft_abs , 'gray'),plt.title('IFFT 频谱',fontproperties=font)
#滤波器曲线计算N=4000
from scipy import signal
w,h=signal.freqz(b,a)
t,y=signal.impulse((b,a),N=10000000)
fig2 = plt.figure(num='滤波器曲线',figsize=(8,6))
# plt.subplot(2,1,1), plt.imshow(img , 'gray'), plt.title('脉冲响应曲线',fontproperties=font)
# plt.subplot(2,1,2), plt.imshow(img , 'gray'), plt.title('频率响应曲线',fontproperties=font)
plt.subplot(1,1,1)
plt.title('频率响应曲线',fontproperties=font)
plt.plot(w/2/np.pi, 20 * np.log10(abs(h)), 'b')
plt.ylabel('幅度 [dB]', color='b',fontproperties=font)
plt.xlabel('Frequency [rad/sample]')
# plt.subplot(2,1,2)
# plt.plot(t,y)
# angles = np.unwrap(np.angle(h))
# plt.plot(w, angles, 'g')
# plt.ylabel('Angle (radians)', color='g')
plt.grid()
plt.axis('tight')
plt.show()



猜你喜欢

转载自blog.csdn.net/qq_22235017/article/details/78586031