一、图像频谱

在 numpy 库的 fft 模块中有计算二维离散傅里叶变换的函数 fft2,此外图像
变换到频域后,原点需要移动到频域矩形的中心,所以要对fft2的结果使用fftshift
函数实现频谱中心化。计算二维离散逆傅里叶变换的函数为 ifft2,频谱去中心化
的函数为 ifftshift。
输入一张灰度图,输出经过二维离散傅里叶变换后的结果,但是傅里叶变换
的结果为复数,需要通过使用 abs 函数求模才可以进行可视化,且因为傅里叶频
谱范围很大,所以要用对数变换来改善视觉效果。
在使用 log 函数的时候,要写成 log(1 + x) 而不是直接用 log(x),以避免出
现 x=0 的情况。
读入一幅灰度图像,求其频谱,代码示例如下:

from skimage import data
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=12)img = data.camera()f = np.fft.fft2(img) # 快速傅里叶变换算法得到频率分布
fshift = np.fft.fftshift(f) # 将原点转移到中间位置
fimg = np.log(np.abs(fshift)+1) # fft 结果是复数,求模之后才是振幅plt.figure(figsize=(10,10))plt.subplot(121)
plt.imshow(img, 'gray')
plt.title('原始图像',fontproperties=font_set)plt.subplot(122)
plt.imshow(fimg, 'gray')
plt.title('傅里叶变换图像',fontproperties=font_set)
plt.show()

输出:

利用函数(np.zeros)生成一个 600* 600 的单通道图像,并在该图中心生成
一个高 400 宽 100 的白色矩形,得到亮块图像,求此图像的频谱图,代码示例如
下:

from skimage import data,transform
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=12)image=np.zeros((600,600),dtype='uint8')
image[100:500,250:350]=255f=np.fft.fft2(image)
fshift = np.fft.fftshift(f)
fimg = np.log(np.abs(fshift)+1)plt.figure(figsize=(6,8))
plt.subplot(121)
plt.imshow(image, plt.cm.gray)
plt.title('单通道图像',fontproperties=font_set)
plt.subplot(122)
plt.imshow(fimg, plt.cm.gray)plt.title('傅里叶变换图像',fontproperties=font_set)
plt.show()image2 =transform.rotate(image,45)
f=np.fft.fft2(image2)
fshift = np.fft.fftshift(f)
fimg = np.log(np.abs(fshift)+1)plt.figure(figsize=(6,8))
plt.subplot(121)
plt.imshow(image2,plt.cm.gray)
plt.title('旋转图像',fontproperties=font_set)
plt.subplot(122)
plt.imshow(fimg,plt.cm.gray)
plt.title('傅里叶变换图像',fontproperties=font_set)
plt.show()

输出:

二、图像频域低通滤波

1. 理想低通滤波器

读入一幅灰度图像,用理想低通滤波器做滤波,代码示例如下:

from skimage import data
import numpy as np
from math import sqrt
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=12)img = data.camera()
f = np.fft.fft2(img) # 快速傅里叶变换算法得到频率分布
fshift = np.fft.fftshift(f) # 将原点转移到中间位置
fimg = np.log(np.abs(fshift)+1) # fft 结果是复数,求模之后才是振幅#实现理想低通滤波器
D=30
rows,cols=img.shape
crow,ccol=int(rows/2),int(cols/2) #计算频谱中心
mask=np.zeros((rows,cols),np.uint8) #生成 rows 行 cols 的矩阵,数据格式为 uint8
for i in range(rows):for j in range(cols):dis = sqrt((i - crow) ** 2 + (j - ccol) ** 2)if dis <=D:# 将距离频谱中心小于 D 的部分低通信息 设置为 1,属于低通滤波mask[i,j]=1else:mask[i,j]=0f1_shift=fshift*mask
f_ishift=np.fft.ifftshift(f1_shift)
img_back=np.fft.ifft2(f_ishift)
img_back=np.abs(img_back)plt.figure(figsize=(10,10))
plt.subplot(121)
plt.imshow(fimg,plt.cm.gray)
plt.title('原始频谱',fontproperties=font_set)plt.subplot(122)
plt.imshow(np.log(np.abs(f1_shift)+1),plt.cm.gray)
plt.title('滤波后频谱',fontproperties=font_set)
plt.figure(figsize=(10,10))plt.subplot(121)
plt.imshow(img, plt.cm.gray)
plt.title('原始图像',fontproperties=font_set)plt.subplot(122)
plt.imshow(img_back, plt.cm.gray)
plt.title('理想低通滤波后图像',fontproperties=font_set)
plt.show()

输出:

2. Butterworth 低通滤波器

读入一幅灰度图像,用 Butterworth 低通滤波器做滤波,代码示例如下:

from skimage import data
import numpy as np
from math import sqrt
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=12)img = data.camera()f = np.fft.fft2(img) # 快速傅里叶变换算法得到频率分布
fshift = np.fft.fftshift(f) # 将原点转移到中间位置transfor_matrix = np.zeros(img.shape)#实现 Butterworth 低通滤波器
d=30
n=2
rows,cols=img.shape
crow,ccol=int(rows/2),int(cols/2) #计算频谱中心
for i in range(rows):for j in range(cols):dis = sqrt((i - crow) ** 2 + (j - ccol) ** 2)transfor_matrix[i, j] = 1 / (1 + (dis / d) ** (2*n))f1_shift=fshift*transfor_matrix
f_ishift=np.fft.ifftshift(f1_shift)
img_back=np.fft.ifft2(f_ishift)
img_back=np.abs(img_back)
plt.figure(figsize=(10,10))
plt.subplot(121)
plt.imshow(img, plt.cm.gray)
plt.title('原始图像',fontproperties=font_set)plt.subplot(122)
plt.imshow(img_back, plt.cm.gray)
plt.title('Butterworth 低通滤波后图像',fontproperties=font_set)
plt.show()

输出:

3. 高斯低通滤波器

读入一幅灰度图像,用高斯低通滤波器做滤波,代码示例如下:

from skimage import data
import numpy as np
from math import sqrt
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=12)img = data.camera()
f = np.fft.fft2(img) # 快速傅里叶变换算法得到频率分布
fshift = np.fft.fftshift(f) # 将原点转移到中间位置transfor_matrix = np.zeros(img.shape)#实现高斯低通滤波器
d=30
rows,cols=img.shape
crow,ccol=int(rows/2),int(cols/2) #计算频谱中心
for i in range(rows):for j in range(cols):dis = sqrt((i - crow) ** 2 + (j - ccol) ** 2)transfor_matrix[i, j] =np.exp(-dis ** 2/(2 * d ** 2))f1_shift=fshift*transfor_matrixf_ishift=np.fft.ifftshift(f1_shift)
img_back=np.fft.ifft2(f_ishift)
img_back=np.abs(img_back)plt.figure(figsize=(10,10))
plt.subplot(121)
plt.imshow(img, plt.cm.gray)
plt.title('原始图像',fontproperties=font_set)plt.subplot(122)
plt.imshow(img_back, plt.cm.gray)
plt.title('Gauss 低通滤波后图像',fontproperties=font_set)
plt.show()

输出:

三、图像频域高通滤波

1. 理想高通滤波器

读入一幅灰度图像,用理想高通滤波器做滤波,代码示例如下:

from skimage import data
import numpy as np
from math import sqrt
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=12)
img = data.camera()f = np.fft.fft2(img) # 快速傅里叶变换算法得到频率分布
fshift = np.fft.fftshift(f) # 将原点转移到中间位置
fimg = np.log(np.abs(fshift)+1) # fft 结果是复数,求模之后才是振幅#实现理想高通滤波器
D=30
rows,cols=img.shape
crow,ccol=int(rows/2),int(cols/2) #计算频谱中心
mask=np.zeros((rows,cols),np.uint8) #生成 rows 行 cols 的矩阵,数据格式为 uint8
for i in range(rows):for j in range(cols):dis = sqrt((i - crow) ** 2 + (j - ccol) ** 2)if dis <=D:# 将距离频谱中心大于 D 的部分高通信息设置为 1,属于高通滤波mask[i,j]=0else:mask[i,j]=1f1_shift=fshift*mask
f_ishift=np.fft.ifftshift(f1_shift)
img_back=np.fft.ifft2(f_ishift)
img_back=np.abs(img_back)plt.figure(figsize=(10,10))
plt.subplot(121)
plt.imshow(fimg,plt.cm.gray)
plt.title('原始频谱',fontproperties=font_set)plt.subplot(122)
plt.imshow(np.log(np.abs(f1_shift)+1),plt.cm.gray)
plt.title('滤波后频谱',fontproperties=font_set)
plt.figure(figsize=(10,10))plt.subplot(121)
plt.imshow(img, plt.cm.gray)
plt.title('原始图像',fontproperties=font_set)plt.subplot(122)
plt.imshow(img_back, plt.cm.gray)
plt.title('理想高通滤波后图像',fontproperties=font_set)
plt.show()

输出:

2. Butterworth 高通滤波器

读入一幅灰度图像,用 Butterworth 高通滤波器做滤波,代码示例如下:

from skimage import data
import numpy as np
from math import sqrt
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=12)img = data.camera()
f = np.fft.fft2(img) # 快速傅里叶变换算法得到频率分布
fshift = np.fft.fftshift(f) # 将原点转移到中间位置transfor_matrix = np.zeros(img.shape)#实现 Butterworth 高通滤波器
d=30
n=2
rows,cols=img.shape
crow,ccol=int(rows/2),int(cols/2) #计算频谱中心for i in range(rows):for j in range(cols):dis = sqrt((i - crow) ** 2 + (j - ccol) ** 2)transfor_matrix[i, j] =1- 1 / (1 + (dis / d) ** (2*n))f1_shift=fshift*transfor_matrix
f_ishift=np.fft.ifftshift(f1_shift)
img_back=np.fft.ifft2(f_ishift)
img_back=np.abs(img_back)plt.figure(figsize=(10,10))
plt.subplot(121)
plt.imshow(img, plt.cm.gray)
plt.title('原始图像',fontproperties=font_set)plt.subplot(122)
plt.imshow(img_back, plt.cm.gray)
plt.title('Butterworth 高通滤波后图像',fontproperties=font_set)
plt.show()

输出:

3. 高斯高通滤波器

读入一幅灰度图像,用高斯高通滤波器做滤波,代码示例如下:

from skimage import data
import numpy as np
from math import sqrt
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=12)img = data.camera()
f = np.fft.fft2(img) # 快速傅里叶变换算法得到频率分布
fshift = np.fft.fftshift(f) # 将原点转移到中间位置transfor_matrix = np.zeros(img.shape)
#实现高斯高通滤波器
d=30rows,cols=img.shape
crow,ccol=int(rows/2),int(cols/2) #计算频谱中心for i in range(rows):for j in range(cols):dis = sqrt((i - crow) ** 2 + (j - ccol) ** 2)transfor_matrix[i, j] =1-np.exp(-dis ** 2/(2 * d ** 2))f1_shift=fshift*transfor_matrix
f_ishift=np.fft.ifftshift(f1_shift)
img_back=np.fft.ifft2(f_ishift)
img_back=np.abs(img_back)plt.figure(figsize=(10,10))
plt.subplot(121)
plt.imshow(img, plt.cm.gray)
plt.title('原始图像',fontproperties=font_set)plt.subplot(122)
plt.imshow(img_back, plt.cm.gray)
plt.title('Gauss 高通滤波后图像',fontproperties=font_set)
plt.show()

输出:

每日“大饼”:
只要你想 这个世界就会有奇迹

Python图像处理八:图像频域滤波相关推荐

  1. 【python图像处理】图像的滤波(ImageFilter类详解)

    在图像处理中,经常需要对图像进行平滑.锐化.边界增强等滤波处理.在使用PIL图像处理库时,我们通过Image类中的成员函数filter()来调用滤波函数对图像进行滤波,而滤波函数则通过ImageFil ...

  2. [Python图像处理] 八.图像腐蚀与图像膨胀

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  3. python图像腐蚀处理_[Python图像处理]八.图像腐蚀和图像膨胀

    图像腐蚀 1.基础理论 形态学转换主要针对的是二值图像(0/1)图像类似于领域被蚕食,将图像中的高亮区域白色部分进行缩减细化,其运行结果图比原图的高亮区域更小.主要包括两个输入对对象: 二值图像,卷积 ...

  4. 数字图像处理与Python实现笔记之频域滤波

    数字图像处理与Python实现笔记 摘要 绪论 1 数字图像处理基础知识 2 彩色图像处理初步 3 空间滤波 4 频域滤波 4.1 傅里叶变换 4.1.1 一维傅里叶变换 4.1.2 二维傅里叶变换 ...

  5. 4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波)、有约束滤波器(维纳滤波器)

    4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波).有约束滤波器(维纳滤波器) 文章目录 4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波).有约束滤波器(维纳滤波器) 1 算 ...

  6. C语言数字图像处理---2.5图像频域滤波

    上一小节我们介绍了图像频域变换,本小节将以此为基础,介绍图像频域滤波的相关内容,包含常见高通/低通/带通/带阻/方向滤波等频域滤波方法,同时以C语言编码实现,帮助初学者理解和掌握如何进行图像的频域滤波 ...

  7. java 图像傅里叶变换_图像频域滤波与傅里叶变换

    1.频率滤波 图像的空间域滤波:用各种模板直接与图像进行卷积运算,实现对图像的处理,这种方法直接对图像空间操作,操作简单.图像处理不仅可以在空间域进行还可以在频率域进行,把空间域的图像开窗卷积形式,变 ...

  8. 9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度、形态平滑、高帽变换、低帽变换)

    9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度.形态平滑.高帽变换.低帽变换) 文章目录 9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度.形 ...

  9. 9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀、膨胀、开启、闭合)

    9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀.膨胀.开启.闭合) 文章目录 9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀.膨胀.开启.闭合) 1 算法原理 1.1 ...

  10. 8.2 Python图像处理之图像典型分割-主动轮廓

    8.2 Python图像处理之图像典型分割-主动轮廓 文章目录 8.2 Python图像处理之图像典型分割-主动轮廓 1 算法原理 2 代码 3 效果 1 算法原理 主动轮廓模型,将图像分割问题转换为 ...

最新文章

  1. 关于TensorFlow报错ModuleNotFoundError: No module named ‘imutils‘
  2. 敏捷开发 | 张三与需求管理
  3. hashmap hash冲突怎么解决_HashMap原理及冲突之简谈
  4. print($arr,true)的参数true表示将$arr的值返会,而不是打印
  5. 大数据之-Hadoop3.x_MapReduce_序列化案例FlowMapper---大数据之hadoop3.x工作笔记0098
  6. eclipse中git的author和commiter的修改
  7. 面试题:什么叫2B树
  8. 阶段3 2.Spring_04.Spring的常用注解_2 常用IOC注解按照作用分类
  9. PDCA循环管理全面解析(含操作指南、案例应用)
  10. mybatis中的事务
  11. python爬取app store的评论_用python爬取苹果官网店铺
  12. SqlServer毫秒/秒转时分秒
  13. 三角形边长求高的c语言函数公式,三角形内三角函数与边长计算公式
  14. 前端静态资源缓存最优解以及max-age的陷阱
  15. ROS小车基于yocs_smoother_velocity做速度平滑处理
  16. 基本软件开发模型:瀑布模型、V型模型、迭代模型、增量模型、螺旋模型、大爆炸模型、敏捷模型、原型模型、W模型 特点分析与总结
  17. Vite ( Vue + TS ) 项目配置 @ 路径别名
  18. 两种取汉字拼音首字母的方法.--函数为转抄而来.
  19. mail 465邮件配置
  20. U²-Net:铅笔肖像画的生成

热门文章

  1. open failed: EACCES (Permission denied)
  2. 解决IDEA中maven项目视图中出现红色波浪线的问题
  3. 从mysql导出数据,不导出表结构
  4. 县城惊现“双十一后”经济,先淘后卖日赚千元
  5. Ubuntu/Linux 安装 支持ass字幕 的视频播放器
  6. Java isDigit()
  7. Linux 命令行与shell编程 第10章 构建基本脚本
  8. 第三十二天学习笔记-web漏洞-文件上传的条件竞争、.htaccess文件与.user.ini文件使用前提、二次渲染
  9. 【MCU】用精妙方案解决按键端口太少问题
  10. linux yum安装ss5,Linux_SS5 安装笔记