滤波器

具体参考一下两篇博客

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()

滤波器

 

滤波器滤波器滤波器

上一篇:FFT求解字符串匹配


下一篇:IE浏览器兼容性的痛苦