数字图像处理(实践篇)十五 基于傅里叶变换的高通滤波和低通滤波

目录

一 Numpy 实现傅里叶变换

1 涉及的函数

2 实践

二 OpenCV 实现傅里叶变换

1 涉及的函数

2 实践


         为了有效地和快速地对图像进行处理和分析,常常需要将原定义在图像空间的图像以某种形式转换(正变换)到另外一些空间,并利用在这些空间的特有性质方便地进行一定的加工,最后再转换回图像空间(反变换或逆变换)以得到所需要的效果。傅里叶变换就是把图像从图像空间变换到频率空间。

        对于一幅图像来说在分析其频率特性时,它的边缘,突变部分以及颗粒噪声往往代表图像信号的高频分量,而大面积的图像背景区则代表图像信号的低频分量。根据此特点使用滤波的方法滤除其高频部分也就能够去除噪声,使图像得到一定的平滑。

低通滤波器:只保留低频,会使得图像变得模糊。

高通滤波器:只保留高频,会使得图像细节增强。例如边界增强。

一 Numpy 实现傅里叶变换

1 涉及的函数
  • np.fft.fft2()

通过 numpy 实现傅里叶变换用到的函数是 np.fft.fft2():

fft.fft2(a, s=None, axes=(-2, -1), norm=None)

函数的功能:计算二维离散傅里叶变换。

输入

①a:输入数组.array_like

②s:可选。整数序列,输出数组的大小。

返回

complex ndarray。

通过 np.fft.fft2() 函数进行傅里叶变换得到频率分布,再调np.fft.fftshift 函数将中心位置转移至中间位置。

  • np.fft.ifft2()
np.fft.ifft2(a, s=None, axes=(-2, -1), norm=None)

函数的功能:实现图像逆傅里叶变换,返回一个复数数组。

输入

①a:输入数组.array_like

②s:可选。整数序列,输出数组的大小。

返回

complex ndarray。

以上只是对常用的参数进行介绍,其他的参数可以详见官方文档去学习哈。

2 实践

实践①:图像的傅里叶变换

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):b, g, r = cv2.split(img)img_rgb = cv2.merge([r, g, b])return img_rgb
def dealImageResult(img_path):im = cv2.imread(img_path, 0)# 实现傅里叶变换f = np.fft.fft2(im)# 实现中心位置转移至中间位置fshift = np.fft.fftshift(f)# 将复数转为浮点数进行傅里叶频谱图显示fimg = 20 * np.log(np.abs(fshift))fig = plt.figure(figsize=(10, 10))titles = ["img", " result"]images = [im, fimg]for i in range(2):plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")plt.title("{}".format(titles[i]), fontsize=20, ha='center')plt.xticks([]), plt.yticks([])#plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)# plt.tight_layout()plt.show()fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':dealImageResult("1.png")pass
  • 结果图

实践②:图像的傅里叶变换与逆变换

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):b, g, r = cv2.split(img)img_rgb = cv2.merge([r, g, b])return img_rgb
def dealImageResult(img_path):im = cv2.imread(img_path, 0)# 实现傅里叶变换f = np.fft.fft2(im)# 实现中心位置转移至中间位置fshift = np.fft.fftshift(f)# 将复数转为浮点数进行傅里叶频谱图显示fimg = 20 * np.log(np.abs(fshift))ifshift = np.fft.ifftshift(fshift)# 将复数转为浮点数进行傅里叶频谱图显示ifimg = np.log(np.abs(ifshift))if_img = np.fft.ifft2(ifshift)result_im = np.abs(if_img)fig = plt.figure(figsize=(10, 10))titles = ["im", " fimg", "ifimg", "result_im"]images = [im, fimg, ifimg, result_im]for i in range(4):plt.subplot(2, 2, i + 1), plt.imshow(images[i], "gray")plt.title("{}".format(titles[i]), fontsize=20, ha='center')plt.xticks([]), plt.yticks([])#plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)# plt.tight_layout()plt.show()fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':dealImageResult("1.png")pass
  • 结果图

实践③:低通滤波

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):b, g, r = cv2.split(img)img_rgb = cv2.merge([r, g, b])return img_rgb
def dealImageResult(img_path):im = cv2.imread(img_path, 0)# 实现傅里叶变换f = np.fft.fft2(im)# 实现中心位置转移至中间位置fshift = np.fft.fftshift(f)rows, cols = im.shapecrow, ccol = rows//2, cols//2# 掩模,大小和图像一样,np.zeros初始化mask = np.zeros((rows, cols), np.uint8)mask[crow-40:crow+40, ccol-40:ccol+40] = 1fshift = fshift * mask# 傅里叶逆变换ifshift = np.fft.ifftshift(fshift)ifimg = np.fft.ifft2(ifshift)result_im = np.abs(ifimg)fig = plt.figure(figsize=(10, 10))titles = ["im", "result_im"]images = [im, result_im]for i in range(2):plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")plt.title("{}".format(titles[i]), fontsize=20, ha='center')plt.xticks([]), plt.yticks([])#plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)# plt.tight_layout()plt.show()fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':dealImageResult("1.png")pass
  • 结果图

实践④:高通滤波

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):b, g, r = cv2.split(img)img_rgb = cv2.merge([r, g, b])return img_rgb
def dealImageResult(img_path):im = cv2.imread(img_path, 0)# 实现傅里叶变换f = np.fft.fft2(im)# 实现中心位置转移至中间位置fshift = np.fft.fftshift(f)rows, cols = im.shapecrow, ccol = rows//2, cols//2# 掩模mask = np.ones((rows, cols), np.uint8)mask[crow-40:crow+40, ccol-40:ccol+40] = 0fshift = fshift * mask# 傅里叶逆变换ifshift = np.fft.ifftshift(fshift)ifimg = np.fft.ifft2(ifshift)result_im = np.abs(ifimg)fig = plt.figure(figsize=(10, 10))titles = ["im", "result_im"]images = [im, result_im]for i in range(2):plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")plt.title("{}".format(titles[i]), fontsize=20, ha='center')plt.xticks([]), plt.yticks([])#plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)# plt.tight_layout()plt.show()fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':dealImageResult("1.png")pass
  • 结果图

二 OpenCV 实现傅里叶变换

        Opencv 中主要通过 cv2.dft() 和 cv2.idft()实现傅里叶变换逆变换

        在输入图像之前需要先把图像从 np.uint8转换为 np.float32格式; 傅里叶变换其得到的结果中,频率为0的部分会在左上角位置,通常需要通过 shift 变换转换到中心的位置。cv2.idft()返回的结果是双通道的(实部,虚部),还需要转换成图像格式才能够展示。

1 涉及的函数
dst = cv.dft(src[, dst[, flags[, nonzeroRows]]])dst = cv2.idft(src[, dst[, flags[, nonzeroRows]]])
2 实践

实践①:图像的傅里叶变换

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):b, g, r = cv2.split(img)img_rgb = cv2.merge([r, g, b])return img_rgb
def dealImageResult(img_path):im = cv2.imread(img_path, 0)# 实现傅里叶变换result = cv2.dft(np.float32(im), flags=cv2.DFT_COMPLEX_OUTPUT)# 实现中心位置转移至中间位置fshift = np.fft.fftshift(result)result_fft = 20 * np.log(cv2.magnitude(fshift[:, :, 0], fshift[:, :, 1]))fig = plt.figure(figsize=(10, 10))titles = ["im", "result_fft"]images = [im, result_fft]for i in range(2):plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")plt.title("{}".format(titles[i]), fontsize=20, ha='center')plt.xticks([]), plt.yticks([])#plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)# plt.tight_layout()plt.show()fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':dealImageResult("5.jpg")pass

结果图

实践②:低通滤波

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):b, g, r = cv2.split(img)img_rgb = cv2.merge([r, g, b])return img_rgb
def dealImageResult(img_path):im = cv2.imread(img_path, 0)# 实现傅里叶变换result = cv2.dft(np.float32(im), flags=cv2.DFT_COMPLEX_OUTPUT)# 实现中心位置转移至中间位置fshift = np.fft.fftshift(result)result_fft = 20 * np.log(cv2.magnitude(fshift[:, :, 0], fshift[:, :, 1]))rows, cols = im.shapecrow, ccol = rows//2, cols//2# 掩模mask = np.zeros((rows, cols, 2), np.uint8)mask[crow-40:crow+40, ccol-40:ccol+40] = 1fshift = fshift * mask# 傅里叶逆变换ifshift = np.fft.ifftshift(fshift)result_im = cv2.idft(ifshift)result_im = cv2.magnitude(result_im[:, :, 0], result_im[:, :, 1])fig = plt.figure(figsize=(10, 10))titles = ["im", "result_im"]images = [im, result_im]for i in range(2):plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")plt.title("{}".format(titles[i]), fontsize=20, ha='center')plt.xticks([]), plt.yticks([])#plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)# plt.tight_layout()plt.show()fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':dealImageResult("5.jpg")pass
  • 结果图

实践③:高通滤波

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):b, g, r = cv2.split(img)img_rgb = cv2.merge([r, g, b])return img_rgb
def dealImageResult(img_path):im = cv2.imread(img_path, 0)# 实现傅里叶变换result = cv2.dft(np.float32(im), flags=cv2.DFT_COMPLEX_OUTPUT)# 实现中心位置转移至中间位置fshift = np.fft.fftshift(result)result_fft = 20 * np.log(cv2.magnitude(fshift[:, :, 0], fshift[:, :, 1]))rows, cols = im.shapecrow, ccol = rows//2, cols//2# 掩模mask = np.ones((rows, cols, 2), np.uint8)mask[crow-40:crow+40, ccol-40:ccol+40] = 0fshift = fshift * mask# 傅里叶逆变换ifshift = np.fft.ifftshift(fshift)result_im = cv2.idft(ifshift)result_im = cv2.magnitude(result_im[:, :, 0], result_im[:, :, 1])fig = plt.figure(figsize=(10, 10))titles = ["im", "result_im"]images = [im, result_im]for i in range(2):plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")plt.title("{}".format(titles[i]), fontsize=20, ha='center')plt.xticks([]), plt.yticks([])#plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)# plt.tight_layout()plt.show()fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':dealImageResult("5.jpg")pass
  • 结果图

前文回顾

入门篇目录

 数字图像处理(入门篇)一 图像的数字化与表示

 数字图像处理(入门篇)二 颜色空间

 数字图像处理(入门篇)三 灰度化

 数字图像处理(入门篇)四 像素关系

 数字图像处理(入门篇)五 图像数据预处理之颜色空间转换

 数字图像处理(入门篇)六 图像数据预处理之坐标变化

 数字图像处理(入门篇)七 图像数据预处理之灰度变化

 数字图像处理(入门篇)八 图像数据预处理之直方图

 数字图像处理(入门篇)九 图像数据预处理之滤波

 数字图像处理(入门篇)十 边缘检测

 数字图像处理(入门篇)十一 形态学处理

 数字图像处理(入门篇)十二 自适应阈值分割

 数字图像处理(入门篇)十三 仿射变换

 数字图像处理(入门篇)十四 透视变换

 实践篇目录

数字图像处理(实践篇)一 将图像中的指定目标用bBox框起来吧!

数字图像处理(实践篇)二 画出图像中目标的轮廓

数字图像处理(实践篇)三 将两张图像按照指定比例融合

数字图像处理(实践篇)四 图像拼接-基于SIFT特征点和RANSAC方法

数字图像处理(实践篇)五 使用Grabcut算法进行物体分割

数字图像处理(实践篇)六 利用hough变换进行直线检测

数字图像处理(实践篇)七 利用霍夫变换进行圆环检测

数字图像处理(实践篇)八 Harris角点检测

数字图像处理(实践篇)九 基于边缘的模板匹配

数字图像处理(实践篇)十 图像质量检测

数字图像处理(实践篇)十一 图像中的条形码解析

数字图像处理(实践篇)十二 基于小波变换的图像降噪

数字图像处理(实践篇)十三 数据增强之给图像添加噪声!

数字图像处理(实践篇)十四 图像金字塔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/234506.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物业报修管理系统

物业报修管理系统是一种能够提高物业管理效率和服务质量的软件,它可以帮助物业公司和业主之间实现快速、方便、高效的报修沟通和处理。 但是很多物业公司还在使用传统的报修方式,比如电话、纸质表格、微信群等,这些方式存在很多问题&#xff…

Linux系统编程:进程总结

这一章主要为进程的基本内容作一个总结,为后面的多进程多线程并发作一个铺垫。 进程标识符pid pid类型为 pid_t。 在涉及有关进程相关内容的时候,一定要熟悉 ps 命令的使用,该命令专门用来打印当前系统的进程信息: 这里经常使用…

【Python数据结构与算法】--- 递归算法的应用 ---[乌龟走迷宫] |人工智能|探索扫地机器人工作原理

🌈个人主页: Aileen_0v0 🔥系列专栏:PYTHON数据结构与算法学习系列专栏💫"没有罗马,那就自己创造罗马~" 目录 导言 解决过程 1.建立数据结构 2.探索迷宫: 算法思路 递归调用的“基本结束条件” 3.乌龟走迷宫的实现代码: …

【MATLAB源码-第92期】基于simulink的QPSK调制解调仿真,采用相干解调对比原始信号和解调信号。

操作环境: MATLAB 2022a 1、算法描述 QPSK,有时也称作四位元PSK、四相位PSK、4-PSK,在坐标图上看是圆上四个对称的点。通过四个相位,QPSK可以编码2位元符号。图中采用格雷码来达到最小位元错误率(BER) —…

Electronica慕尼黑电子展 Samtec团队与21ic分享虎家产品与方案

【摘要/前言】 “希望但凡是能够使用到连接器的场合都有Samtec的身影” 在慕尼黑上海电子展现场,Samtec华东区销售经理章桢彦先生在与21ic副主编刘岩轩老师的采访中,如是说道。这是一种愿景,更是Samtec的努力方向。短短一句话,…

​[Oracle]编写程序,键盘输入n,计算1+前n项之和。测试案例:输入:10 输出:22.47​

编写程序,键盘输入n,计算1前n项之和。 测试案例: 输入:10 输出:22.47 代码如下: set serveroutput on declare v_sum number:0;v_n number;beginv_n:&n;for i in 1..v_n loopv_sum:v_sumsqrt(i); end loop; d…

1+X网络系统建设与运维练习题

1.OSPF的最优路由,会放到IP路由表中指导数据转发 (x) 2.当AP工作在2.4GHz频段的时候,AP工作的频率范围是2.4GHz~2.4835GHZ。在此频率范围内又划分出14个信道。每信道的中心频率相隔5MHz,每个信道可供占用的带宽为22MHz…

jenkins 使用 nexus插件,将代码打包好推送到制品库

Nexus是一个开源的、基于Java的应用程序框架和存储库管理系统,可用于管理软件开发和部署的所有相关构件。 它允许用户创建和维护Maven存储库,使其更易于组织,搜索和共享构建工件和库。 Nexus具有安全性和身份验证、多格式支持、镜像管理和自定…

Diffusion:通过扩散和逆扩散过程生成图像的生成式模型

在当今人工智能大火的时代,AIGC 可以帮助用户完成各种任务。作为 AIGC 主流模型的 DDPM,也时常在各种论文中被提起。DDPM 本质就是一种扩散模型,可以用来生成图片或者为图片去噪。 扩散模型定义了一个扩散的马尔科夫过程,每一步逐…

如何使用阿里云虚拟主机和域名设置网站?

本文档将向您展示如何使用阿里云虚拟主机来设置一个新网站,并完成一个域名。如果您按照此处的步骤操作,您将启动并运行一个新网站,可以使用您选择的名称在全球范围内访问,并托管在阿里云平台上。 本文档假设您已经拥有有效的阿里…

微信小程序 slider 翻转最大和最小值

微信小程序 slider 翻转最大和最小值 场景代码示例index.wxmlindex.jsutil.js 参考资料 场景 我想使用 slider 时最左边是 10 最右是 -10。 但是想当然的直接改成<slider min"10" max"-10" step"1" /> 并没用。 查了文档和社区也没有现成…

基于springboot实现的在线考试系统

一、系统架构 前端&#xff1a;html | js | css | jquery | bootstrap 后端&#xff1a;springboot | springdata-jpa 环境&#xff1a;jdk1.7 | mysql | maven 二、 代码及数据库 三、功能介绍 01. 登录页 02. 管理员端-课程管理 03. 管理员端-班级管理 04. 管理员端-老师管理…