CV-图像进行FFT算法及逆算法python实现 BJUT数学与图像处理作业

2019-04-14 12:10发布

在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:windowsfontssimsun.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()