具体参考一下两篇博客
https://blog.csdn.net/TOMBOY_Marry/article/details/83994915
https://blog.csdn.net/TOMBOY_Marry/article/details/83995483
图像处理也太好玩了啊!!!!!!突然get到这门课的魅力了!我会好好学这门课的!
傅里叶变换与傅里叶逆变换
import cv2 import numpy as np from matplotlib import pyplot as plt #显示中文 plt.rcParams['font.sans-serif']=['SimHei'] #读取图像 img=cv2.imread('test1.jpg',0) #傅里叶变换 #傅里叶变换库函数调用 dft=cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT) #将傅里叶频域从左上角移动到中间 dftshift=np.fft.fftshift(dft) #双通道结果转换为0到255范围 res1=20*np.log(cv2.magnitude(dftshift[:,:,0],dftshift[:,:,1])) #傅里叶逆变换 #将频域从中间移动到左上角 ishift=np.fft.ifftshift(dftshift) #傅里叶逆变换库函数调用 iimg=cv2.idft(ishift) #双通道结果转换为0到255范围 res2=cv2.magnitude(iimg[:,:,0],iimg[:,:,1]) #图像显示 plt.subplot(131),plt.imshow(img,'gray'),plt.title('原图像') plt.axis('off') plt.subplot(132),plt.imshow(res1,'gray'),plt.title('傅里叶变换') plt.axis('off') plt.subplot(133),plt.imshow(res2,'gray'),plt.title('傅里叶逆变换') plt.axis('off') plt.show()
基于opencv傅里叶变换的低通滤波
import cv2 import numpy as np from matplotlib import pyplot as plt new_img=cv2.imread('C:/Users/Administrator/Desktop/test/test2.jpg',0) dft=cv2.dft(np.float32(new_img),flags=cv2.DFT_COMPLEX_OUTPUT) dft_shift=np.fft.fftshift(dft) rows,cols=new_img.shape #计算频谱中心 crow,ccol=int(rows/2),int(cols/2) #生成rows行cols列的二维矩阵,数据格式为uint8 mask=np.zeros((rows,cols,2),np.uint8) #将靠近频谱中心的部分低通信息设置为1,属于低通滤波 mask[crow-30:crow+30,ccol-30:ccol+30]=1 fshift=dft_shift*mask #傅里叶逆变换 f_ishift=np.fft.ifftshift(fshift) img_back=cv2.idft(f_ishift) #计算像素梯度的绝对值 img_back=cv2.magnitude(img_back[:,:,0],img_back[:,:,1]) img_back=np.abs(img_back) img_back=(img_back-np.amin(img_back))/(np.amax(img_back)-np.amin(img_back)) plt.figure(figsize=(15,15)) plt.subplot(121),plt.imshow(new_img,'gray'),plt.title('input image') plt.subplot(122),plt.imshow(img_back,'gray'),plt.title('output image') plt.show()
基于numpy傅里叶变换的低通滤波
#导入相关库 import cv2 import numpy as np import matplotlib.pyplot as plt #使用cv2 读入图片 new_img=cv2.imread('person.jpg',0) #numpy中的傅立叶变化 f1=np.fft.fft2(new_img) f1_shift=np.fft.fftshift(f1) #np.fft.fftshift()函数来实现平移,让直流分量在输出图像的重心 rows,cols=new_img.shape crow,ccol=int(rows/2),int(cols/2) #计算频谱中心 mask=np.zeros((rows,cols),np.uint8) #生成rows行cols的矩阵,数据格式为uint8 mask[crow-30:crow+30,ccol-30:ccol+30]=1 #将靠近频谱中心的部分低通信息 设置为1,属于低通滤波 f1_shift=f1_shift*mask #傅立叶逆变换 f_ishift=np.fft.ifftshift(f1_shift) img_back=np.fft.ifft2(f_ishift) img_back=np.abs(img_back) img_back=(img_back-np.amin(img_back))/(np.amax(img_back)-np.amin(img_back)) plt.figure(figsize=(15,15)) plt.subplot(121),plt.imshow(new_img,cmap='gray'),plt.title('input image') plt.subplot(122),plt.imshow(img_back,cmap='gray'),plt.title('output image')
滤波器
#导入相关库 import cv2 import numpy as np import matplotlib.pyplot as plt #使用cv2 读入图片 new_img=cv2.imread('C:/Users/Administrator/Desktop/test/test2.jpg',0) rows,cols=new_img.shape crow,ccol=int(rows/2),int(cols/2)#计算频谱中心 mask1=np.ones((rows,cols),np.uint8)#生成rows行cols的矩阵,数据格式为uint8 mask2=np.ones((rows,cols),np.uint8) #1代表低通滤波器,0代表高通滤波器 mask1[crow-30:crow+30,ccol-30:ccol+30]=1 mask2[crow-10:crow+10,ccol-10:ccol+10]=1 f1=np.fft.fft2(new_img) f1shift=np.fft.fftshift(f1) f1shift_1=f1shift*mask1 f1shift_2=f1shift*mask2 #傅立叶逆变换 f_ishift_1=np.fft.ifftshift(f1shift_1) f_ishift_2=np.fft.ifftshift(f1shift_2) img_back_1=np.fft.ifft2(f_ishift_1) img_back_2=np.fft.ifft2(f_ishift_2) img_back_1=np.abs(img_back_1) img_back_2=np.abs(img_back_2) plt.figure(figsize=(14,14)) plt.subplot(221),plt.imshow(new_img,cmap='gray'),plt.title('input image') plt.subplot(222),plt.imshow(img_back_1,cmap='gray'),plt.title('output image r=30') plt.subplot(223),plt.imshow(img_back_2,cmap='gray'),plt.title('output image r=10') plt.show()