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数字图像处理(四) 频率域滤波相关推荐

  1. 第4章 Python 数字图像处理(DIP) - 频率域滤波10 - 使用低通频率域滤波器平滑图像 - 理想、高斯、巴特沃斯低通滤波器

    目录 使用低通频率域滤波器平滑图像 理想低通滤波器(ILPF) 高斯低通滤波器(GLPF) 巴特沃斯低通滤波器 低通滤波的例子 使用低通频率域滤波器平滑图像 理想低通滤波器(ILPF) 在以原点为中心 ...

  2. 第4章 Python 数字图像处理(DIP) - 频率域滤波11 - 使用高通滤波器锐化图像

    目录 使用高通滤波器锐化图像 由低通滤波器得到理想.高斯和巴特沃斯高通滤波器 指纹增强 频域中的拉普拉斯 钝化掩蔽.高提升滤波和高频强调滤波 同态滤波 使用高通滤波器锐化图像 由低通滤波器得到理想.高 ...

  3. 第4章 Python 数字图像处理(DIP) - 频率域滤波8 - 二维DFT和IDFT的一些性质 - 二维离散卷积定理

    目录 二维DFT和IDFT的一些性质 二维离散卷积定理 二维离散傅里叶变换性质的小结 二维DFT和IDFT的一些性质 二维离散卷积定理 二维循环卷积表达式: (f⋆h)(x,y)=∑m=0M−1∑n= ...

  4. 第4章 Python 数字图像处理(DIP) - 频率域滤波1 - 傅里叶级数和变换简史

    本章主要讲解频域域滤波的技术,主要技术用到是大家熟悉的傅里叶变换与傅里叶反变换.这里有比较多的篇幅讲解的傅里叶的推导进程,用到Numpy傅里叶变换.本章理论基础比较多,需要更多的耐心来阅读,有发现有错 ...

  5. 第4章 Python 数字图像处理(DIP) - 频率域滤波12 - 选择性滤波 - 带阻

    目录 选择性滤波 带阻滤波器和带通滤波器 陷波滤波器 选择性滤波 处理特定的频带的滤波器称为频带滤波器 带阻滤波器: 若某个频带中的频率被滤除 带通滤波器: 若某个频带中的频率被通过 处理小频率矩形区 ...

  6. 第4章 Python 数字图像处理(DIP) - 频率域滤波5 - 二变量函数的傅里叶变换、图像中的混叠、二维离散傅里叶变换及其反变换

    目录 二变量函数的傅里叶变换 二维冲激及其取样性质 二维连续傅里叶变换对 二维取样和二维取样定理 图像中的混叠 二维离散傅里叶变换及其反变换 二变量函数的傅里叶变换 二维冲激及其取样性质 两个连续变量 ...

  7. 第4章 Python 数字图像处理(DIP) - 频率域滤波6 - 二维DFT和IDFT的一些性质 - 平移和旋转、周期性、对称性

    目录 二维DFT和IDFT的一些性质 空间间隔和频率间隔的关系 平移和旋转 周期性 对称性 二维DFT和IDFT的一些性质 空间间隔和频率间隔的关系 Δu=1MΔT(4.69)\Delta u = \ ...

  8. 第4章 Python 数字图像处理(DIP) - 频率域滤波2 - 复数、傅里叶级数、连续单变量函数的傅里叶变换、卷积

    目录 基本概念 复数 傅里叶级数 冲激函数及其取样(筛选)性质 连续单变量函数的傅里叶变换 卷积 基本概念 复数 复数CCC的定义为 C=R+jI(4.3)C = R + jI \tag{4.3}C= ...

  9. 第4章 Python 数字图像处理(DIP) - 频率域滤波3 - 取样和取样函数的傅里叶变换、混叠

    目录 取样和取样函数的傅里叶变换 取样 取样后的函数的傅里叶变换 取样定理 混叠 由取样后的数据重建(复原)函数 取样和取样函数的傅里叶变换 取样 fˉ(t)=f(t)sΔT(t)=∑n=−∞∞f(t ...

最新文章

  1. 变量作用域与预处理命令习题
  2. python 参数
  3. 【编程题】简单的四则运算
  4. 远程计算机 函数不支持,win7远程桌面连接提示要求的函数不受支持怎么办
  5. Caddy、 SSLDocker、Nginx 性能比较及使用体验
  6. 台式计算机主机组成图,台式电脑主板的各部分组成及详细说明,还有各种连...-卓优商学问答...
  7. 常用软件问题四则希望对大家有帮助
  8. 计算机无法启动print,本地计算机无法启动print spooler服务,错误1069怎么处理
  9. matinee和matin区别_法语小灶 | an和année, jour和journée有什么区别?
  10. SpringBoot 集成SpringSecurity整体流程
  11. java 图形_java 画立体图形
  12. 联发科p60和骁龙710哪个好_骁龙670、联发科P60和麒麟710哪个好 详细对比介绍
  13. 数学笔记:FFT(快速傅里叶变换)
  14. 指针式万用表使用与原理
  15. 傅里叶展开锯齿波形图
  16. 【选品】Shopee虾皮马来西亚和印尼站点分析
  17. Docker 基础知识 - 使用绑定挂载(bind mounts)管理应用程序数据
  18. NFS共享存储服务介绍与案例详细配置过程
  19. 十一月六日作业(双十一广告)
  20. 手把手教你 Tableau 绘制跑道图(二十六)

热门文章

  1. Widget(桌面插件)
  2. Oolong and Gnoloo
  3. Android使用NDK OpenGL ES3.0绘制一个三角形
  4. spring中AOP动态代理的两种方式
  5. (转)python3 计算字符串、文件md5值
  6. The method getTextContent() is undefined ?
  7. Idea问题:“marketplace plugins are not loaded”解决方案
  8. (2016北京集训十二)【xsy1542】疯狂求导
  9. 首次使用eclipes运行项目报错“Java.lang.ClassNotFoundException”
  10. javaScript解决Form的嵌套