python数字图像处理(四) 频率域滤波
import matplotlib.pyplot as plt
import numpy as np
import cv2
%matplotlib inline
首先读入这次需要使用的图像
img = cv2.imread('apple.jpg',0) #直接读为灰度图像
plt.imshow(img,cmap="gray")
plt.axis("off")
plt.show()
使用numpy带的fft库完成从频率域到空间域的转换。
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
低通滤波器
低通滤波器的公式如下
\[ H(u,v)= \begin{cases} 1, & \text{if $D(u,v)$ } \leq D_{0}\\ 0, & \text{if $D(u,v)$} \geq D_{0} \end{cases} \]
其中\(D(u,v)\)为频率域上\((u,v)\)点到中心的距离,\(D_0\)由自己设置
白点就是所允许通过的频率范围
3d图像如下
我们先把苹果转化成频率域看下效果
#取绝对值:将复数变化成实数
#取对数的目的为了将数据变化到0-255
s1 = np.log(np.abs(fshift))
plt.subplot(121),plt.imshow(s1,'gray')
plt.title('Frequency Domain')
plt.show()
matplotlib对于不是uint8的图像会自动把图像的数值缩放到0-255上,更多可以查看对该问题的讨论
我们在频率域上试着取不同的\(d_0\)再将其反变换到空间域看下效果
def make_transform_matrix(d,image):transfor_matrix = np.zeros(image.shape)center_point = tuple(map(lambda x:(x-1)/2,s1.shape))for i in range(transfor_matrix.shape[0]):for j in range(transfor_matrix.shape[1]):def cal_distance(pa,pb):from math import sqrtdis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)return disdis = cal_distance(center_point,(i,j))if dis <= d:transfor_matrix[i,j]=1else:transfor_matrix[i,j]=0return transfor_matrixd_1 = make_transform_matrix(10,fshift)
d_2 = make_transform_matrix(30,fshift)
d_3 = make_transform_matrix(50,fshift)
设定距离分别为10,30,50其通过的频率的范围如图
plt.subplot(131)
plt.axis("off")
plt.imshow(d_1,cmap="gray")
plt.title('D_1 10')
plt.subplot(132)
plt.axis("off")
plt.title('D_2 30')
plt.imshow(d_2,cmap="gray")
plt.subplot(133)
plt.axis("off")
plt.title("D_3 50")
plt.imshow(d_3,cmap="gray")
plt.show()
img_d1 = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_1)))
img_d2 = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_2)))
img_d3 = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_3)))
plt.subplot(131)
plt.axis("off")
plt.imshow(img_d1,cmap="gray")
plt.title('D_1 10')
plt.subplot(132)
plt.axis("off")
plt.title('D_2 30')
plt.imshow(img_d2,cmap="gray")
plt.subplot(133)
plt.axis("off")
plt.title("D_3 50")
plt.imshow(img_d3,cmap="gray")
plt.show()
讲上面过程整理得到频率域低通滤波器的代码如下
def lowPassFilter(image,d):f = np.fft.fft2(image)fshift = np.fft.fftshift(f)def make_transform_matrix(d):transfor_matrix = np.zeros(image.shape)center_point = tuple(map(lambda x:(x-1)/2,s1.shape))for i in range(transfor_matrix.shape[0]):for j in range(transfor_matrix.shape[1]):def cal_distance(pa,pb):from math import sqrtdis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)return disdis = cal_distance(center_point,(i,j))if dis <= d:transfor_matrix[i,j]=1else:transfor_matrix[i,j]=0return transfor_matrixd_matrix = make_transform_matrix(d)new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))return new_img
plt.imshow(lowPassFilter(img,60),cmap="gray")
高通滤波器
高通滤波器同低通滤波器非常类似,只不过二者通过的波正好是相反的
\[ H(u,v)= \begin{cases} 0, & \text{if $D(u,v)$ } \leq D_{0}\\ 1, & \text{if $D(u,v)$} \geq D_{0} \end{cases} \]
def highPassFilter(image,d):f = np.fft.fft2(image)fshift = np.fft.fftshift(f) def make_transform_matrix(d):transfor_matrix = np.zeros(image.shape)center_point = tuple(map(lambda x:(x-1)/2,s1.shape))for i in range(transfor_matrix.shape[0]):for j in range(transfor_matrix.shape[1]):def cal_distance(pa,pb):from math import sqrtdis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)return disdis = cal_distance(center_point,(i,j))if dis <= d:transfor_matrix[i,j]=0else:transfor_matrix[i,j]=1return transfor_matrixd_matrix = make_transform_matrix(d)new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))return new_img
img_d1 = highPassFilter(img,10)
img_d2 = highPassFilter(img,30)
img_d3 = highPassFilter(img,50)
plt.subplot(131)
plt.axis("off")
plt.imshow(img_d1,cmap="gray")
plt.title('D_1 10')
plt.subplot(132)
plt.axis("off")
plt.title('D_2 30')
plt.imshow(img_d2,cmap="gray")
plt.subplot(133)
plt.axis("off")
plt.title("D_3 50")
plt.imshow(img_d3,cmap="gray")
plt.show()
显然当\(D_0=10\)时,苹果的边缘最清楚
不同滤波的比较
import imagefilter
thread_img = imagefilter.RobertsAlogrithm(img)
laplace_img = imagefilter.LaplaceAlogrithm(img,"fourfields")
mean_img = cv2.blur(img,(3,3))
plt.subplot(131)
plt.imshow(thread_img,cmap="gray")
plt.title("ThreadImage")
plt.axis("off")
plt.subplot(132)
plt.imshow(laplace_img,cmap="gray")
plt.axis("off")
plt.title("LaplaceImage")
plt.subplot(133)
plt.imshow(mean_img,cmap="gray")
plt.title("meanImage")
plt.axis("off")
plt.show()
空间域上的平均滤波和低通滤波一样,只要起去掉无关信息,平滑图像的作用。
Roberts,Laplace等滤波则起的提取边缘的作用。
频率域高通滤波器
高斯高通滤波器
频率域高斯高通滤波器的公式如下
\[ H(u,v) = 1-e^{\dfrac{-D^2(u,v)}{2D_0^2}} \]
def GaussianHighFilter(image,d):f = np.fft.fft2(image)fshift = np.fft.fftshift(f)def make_transform_matrix(d):transfor_matrix = np.zeros(image.shape)center_point = tuple(map(lambda x:(x-1)/2,s1.shape))for i in range(transfor_matrix.shape[0]):for j in range(transfor_matrix.shape[1]):def cal_distance(pa,pb):from math import sqrtdis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)return disdis = cal_distance(center_point,(i,j))transfor_matrix[i,j] = 1-np.exp(-(dis**2)/(2*(d**2)))return transfor_matrixd_matrix = make_transform_matrix(d)new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))return new_img
使用高斯滤波器d分别为10,30,50实现的效果
img_d1 = GaussianHighFilter(img,10)
img_d2 = GaussianHighFilter(img,30)
img_d3 = GaussianHighFilter(img,50)
plt.subplot(131)
plt.axis("off")
plt.imshow(img_d1,cmap="gray")
plt.title('D_1 10')
plt.subplot(132)
plt.axis("off")
plt.title('D_2 30')
plt.imshow(img_d2,cmap="gray")
plt.subplot(133)
plt.axis("off")
plt.title("D_3 50")
plt.imshow(img_d3,cmap="gray")
plt.show()
高斯低通滤波器
频率域高斯低通滤波器的公式如下
\[ H(u,v) = e^{\dfrac{-D^2(u,v)}{2D_0^2}} \]
def GaussianLowFilter(image,d):f = np.fft.fft2(image)fshift = np.fft.fftshift(f)def make_transform_matrix(d):transfor_matrix = np.zeros(image.shape)center_point = tuple(map(lambda x:(x-1)/2,s1.shape))for i in range(transfor_matrix.shape[0]):for j in range(transfor_matrix.shape[1]):def cal_distance(pa,pb):from math import sqrtdis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)return disdis = cal_distance(center_point,(i,j))transfor_matrix[i,j] = np.exp(-(dis**2)/(2*(d**2)))return transfor_matrixd_matrix = make_transform_matrix(d)new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))return new_img
img_d1 = GaussianLowFilter(img,10)
img_d2 = GaussianLowFilter(img,30)
img_d3 = GaussianLowFilter(img,50)
plt.subplot(131)
plt.axis("off")
plt.imshow(img_d1,cmap="gray")
plt.title('D_1 10')
plt.subplot(132)
plt.axis("off")
plt.title('D_2 30')
plt.imshow(img_d2,cmap="gray")
plt.subplot(133)
plt.axis("off")
plt.title("D_3 50")
plt.imshow(img_d3,cmap="gray")
plt.show()
空间域的高斯滤波
通常空间域使用高斯滤波来平滑图像,在上一篇已经写过,直接使用上篇文章的代码。
def GaussianOperator(roi):GaussianKernel = np.array([[1,2,1],[2,4,2],[1,2,1]])result = np.sum(roi*GaussianKernel/16)return resultdef GaussianSmooth(image):new_image = np.zeros(image.shape)image = cv2.copyMakeBorder(image,1,1,1,1,cv2.BORDER_DEFAULT)for i in range(1,image.shape[0]-1):for j in range(1,image.shape[1]-1):new_image[i-1,j-1] =GaussianOperator(image[i-1:i+2,j-1:j+2])return new_image.astype(np.uint8)new_apple = GaussianSmooth(img)
plt.subplot(121)
plt.axis("off")
plt.title("origin image")
plt.imshow(img,cmap="gray")
plt.subplot(122)
plt.axis("off")
plt.title("Gaussian image")
plt.imshow(img,cmap="gray")
plt.subplot(122)
plt.axis("off")
plt.show()
巴特沃斯滤波器
无论是低通滤波器,高通滤波器都是粗暴的一刀切,正如之前那么多空间域的滤波器一样,我们希望它通过的频率和与中心线性相关。
\[ h(u,v) = \frac{1} {{1+(D_0 / D(u,v))}^{2n}} \]
def butterworthPassFilter(image,d,n):f = np.fft.fft2(image)fshift = np.fft.fftshift(f)def make_transform_matrix(d):transfor_matrix = np.zeros(image.shape)center_point = tuple(map(lambda x:(x-1)/2,s1.shape))for i in range(transfor_matrix.shape[0]):for j in range(transfor_matrix.shape[1]):def cal_distance(pa,pb):from math import sqrtdis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)return disdis = cal_distance(center_point,(i,j))transfor_matrix[i,j] = 1/((1+(d/dis))**n)return transfor_matrixd_matrix = make_transform_matrix(d)new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))return new_img
plt.subplot(231)
butter_100_1 = butterworthPassFilter(img,100,1)
plt.imshow(butter_100_1,cmap="gray")
plt.title("d=100,n=1")
plt.axis("off")
plt.subplot(232)
butter_100_2 = butterworthPassFilter(img,100,2)
plt.imshow(butter_100_2,cmap="gray")
plt.title("d=100,n=2")
plt.axis("off")
plt.subplot(233)
butter_100_3 = butterworthPassFilter(img,100,3)
plt.imshow(butter_100_3,cmap="gray")
plt.title("d=100,n=3")
plt.axis("off")
plt.subplot(234)
butter_100_1 = butterworthPassFilter(img,30,1)
plt.imshow(butter_100_1,cmap="gray")
plt.title("d=30,n=1")
plt.axis("off")
plt.subplot(235)
butter_100_2 = butterworthPassFilter(img,30,2)
plt.imshow(butter_100_2,cmap="gray")
plt.title("d=30,n=2")
plt.axis("off")
plt.subplot(236)
butter_100_3 = butterworthPassFilter(img,30,3)
plt.imshow(butter_100_3,cmap="gray")
plt.title("d=30,n=3")
plt.axis("off")
plt.show()
可以明显的观察出过大的n造成的振铃现象
butter_5_1 = butterworthPassFilter(img,5,1)
plt.imshow(butter_5_1,cmap="gray")
plt.title("d=5,n=3")
plt.axis("off")
plt.show()
转载于:https://www.cnblogs.com/lynsyklate/p/7932142.html
python数字图像处理(四) 频率域滤波相关推荐
- 第4章 Python 数字图像处理(DIP) - 频率域滤波10 - 使用低通频率域滤波器平滑图像 - 理想、高斯、巴特沃斯低通滤波器
目录 使用低通频率域滤波器平滑图像 理想低通滤波器(ILPF) 高斯低通滤波器(GLPF) 巴特沃斯低通滤波器 低通滤波的例子 使用低通频率域滤波器平滑图像 理想低通滤波器(ILPF) 在以原点为中心 ...
- 第4章 Python 数字图像处理(DIP) - 频率域滤波11 - 使用高通滤波器锐化图像
目录 使用高通滤波器锐化图像 由低通滤波器得到理想.高斯和巴特沃斯高通滤波器 指纹增强 频域中的拉普拉斯 钝化掩蔽.高提升滤波和高频强调滤波 同态滤波 使用高通滤波器锐化图像 由低通滤波器得到理想.高 ...
- 第4章 Python 数字图像处理(DIP) - 频率域滤波8 - 二维DFT和IDFT的一些性质 - 二维离散卷积定理
目录 二维DFT和IDFT的一些性质 二维离散卷积定理 二维离散傅里叶变换性质的小结 二维DFT和IDFT的一些性质 二维离散卷积定理 二维循环卷积表达式: (f⋆h)(x,y)=∑m=0M−1∑n= ...
- 第4章 Python 数字图像处理(DIP) - 频率域滤波1 - 傅里叶级数和变换简史
本章主要讲解频域域滤波的技术,主要技术用到是大家熟悉的傅里叶变换与傅里叶反变换.这里有比较多的篇幅讲解的傅里叶的推导进程,用到Numpy傅里叶变换.本章理论基础比较多,需要更多的耐心来阅读,有发现有错 ...
- 第4章 Python 数字图像处理(DIP) - 频率域滤波12 - 选择性滤波 - 带阻
目录 选择性滤波 带阻滤波器和带通滤波器 陷波滤波器 选择性滤波 处理特定的频带的滤波器称为频带滤波器 带阻滤波器: 若某个频带中的频率被滤除 带通滤波器: 若某个频带中的频率被通过 处理小频率矩形区 ...
- 第4章 Python 数字图像处理(DIP) - 频率域滤波5 - 二变量函数的傅里叶变换、图像中的混叠、二维离散傅里叶变换及其反变换
目录 二变量函数的傅里叶变换 二维冲激及其取样性质 二维连续傅里叶变换对 二维取样和二维取样定理 图像中的混叠 二维离散傅里叶变换及其反变换 二变量函数的傅里叶变换 二维冲激及其取样性质 两个连续变量 ...
- 第4章 Python 数字图像处理(DIP) - 频率域滤波6 - 二维DFT和IDFT的一些性质 - 平移和旋转、周期性、对称性
目录 二维DFT和IDFT的一些性质 空间间隔和频率间隔的关系 平移和旋转 周期性 对称性 二维DFT和IDFT的一些性质 空间间隔和频率间隔的关系 Δu=1MΔT(4.69)\Delta u = \ ...
- 第4章 Python 数字图像处理(DIP) - 频率域滤波2 - 复数、傅里叶级数、连续单变量函数的傅里叶变换、卷积
目录 基本概念 复数 傅里叶级数 冲激函数及其取样(筛选)性质 连续单变量函数的傅里叶变换 卷积 基本概念 复数 复数CCC的定义为 C=R+jI(4.3)C = R + jI \tag{4.3}C= ...
- 第4章 Python 数字图像处理(DIP) - 频率域滤波3 - 取样和取样函数的傅里叶变换、混叠
目录 取样和取样函数的傅里叶变换 取样 取样后的函数的傅里叶变换 取样定理 混叠 由取样后的数据重建(复原)函数 取样和取样函数的傅里叶变换 取样 fˉ(t)=f(t)sΔT(t)=∑n=−∞∞f(t ...
最新文章
- 变量作用域与预处理命令习题
- python 参数
- 【编程题】简单的四则运算
- 远程计算机 函数不支持,win7远程桌面连接提示要求的函数不受支持怎么办
- Caddy、 SSLDocker、Nginx 性能比较及使用体验
- 台式计算机主机组成图,台式电脑主板的各部分组成及详细说明,还有各种连...-卓优商学问答...
- 常用软件问题四则希望对大家有帮助
- 计算机无法启动print,本地计算机无法启动print spooler服务,错误1069怎么处理
- matinee和matin区别_法语小灶 | an和année, jour和journée有什么区别?
- SpringBoot 集成SpringSecurity整体流程
- java 图形_java 画立体图形
- 联发科p60和骁龙710哪个好_骁龙670、联发科P60和麒麟710哪个好 详细对比介绍
- 数学笔记:FFT(快速傅里叶变换)
- 指针式万用表使用与原理
- 傅里叶展开锯齿波形图
- 【选品】Shopee虾皮马来西亚和印尼站点分析
- Docker 基础知识 - 使用绑定挂载(bind mounts)管理应用程序数据
- NFS共享存储服务介绍与案例详细配置过程
- 十一月六日作业(双十一广告)
- 手把手教你 Tableau 绘制跑道图(二十六)
热门文章
- Widget(桌面插件)
- Oolong and Gnoloo
- Android使用NDK OpenGL ES3.0绘制一个三角形
- spring中AOP动态代理的两种方式
- (转)python3 计算字符串、文件md5值
- The method getTextContent() is undefined ?
- Idea问题:“marketplace plugins are not loaded”解决方案
- (2016北京集训十二)【xsy1542】疯狂求导
- 首次使用eclipes运行项目报错“Java.lang.ClassNotFoundException”
- javaScript解决Form的嵌套