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

目录

一 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.mzph.cn/news/187222.shtml

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

相关文章

使用gparted进行ubuntu虚拟机的磁盘扩容(解决gparted无法拖动分区的问题)

在学习内核编译下载linux内核源码的时候,由于源码非常大,下载的时候提示磁盘空间不足,我才意识到刚开始创建虚拟机的时候分配了20GB的空间现在已经快用光了。在VM的设置里可以进行扩容,我扩展到了30GB重启却发现空间并没有加到我使…

数据库应用:MongoDB 文档与索引管理

目录 一、理论 1.MongoDB文档管理 2.MongoDB索引管理 二、实验 1.MongoDB文档管理 2.MongoDB索引管理(索引添加与删除) 3.MongoDB索引管理(全文索引) 4.MongoDB索引管理(多列索引) 5.MongoDB索引管…

虚拟数字人有什么用?有哪些应用场景?

​​过去三年,元宇宙概念进入到大众视野,虚拟数字人备受关注。抖音达人柳夜熙、洛天依、网红虚拟偶像AYAYI等,随着元宇宙的流行,数字人也逐渐成为一种趋势。据行业预测,到2030年,中国的数字人总市场规模将达…

APITable免费开源的多维表格与可视化数据库本地部署公网远程访问

APITable免费开源的多维表格与可视化数据库公网远程访问 文章目录 APITable免费开源的多维表格与可视化数据库公网远程访问前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c…

我与开源的历程

我在2000年开始接触开源,当时在松下航空电子美国总部工作。我负责将 IFE 系统从 Win31 迁移到 Linux。作为一个完全不懂 Linux 的小白,我不得不找到一台笔记本电脑安装并自学 Redhat Linux 6.1。2003年回到新加坡后,我发现没有一个凝聚 Linux…

最新AI创作系统ChatGPT系统运营源码+DALL-E3文生图+支持OpenAI-GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

centos7下执行yum命令报错

前言 在Linux系统中,安装nginx时候,需要先安装环境。 Nginx是使用C语言开发,安装nginx需要先从官网上将源码下载,然后编译,编译需要gcc环境,但是在安装gcc环境的时候,执行命令报错。 yum install –y gcc-…

Java零基础——Redis篇

1.【熟悉】NoSQL的简介 1.1 什么是NoSQL NoSQL 是 Not Only SQL 的缩写,意即"不仅仅是SQL"的意思,泛指非关系型的数据库。强调Key-Value Stores和文档数据库的优点。 NoSQL产品是传统关系型数据库的功能阉割版本,通过减少用不到或…

易宝OA ExecuteSqlForSingle SQL注入漏洞复现

0x01 产品简介 易宝OA系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台,具有信息管理、 流程管理 、知识管理(档案和业务管理)、协同办公等多种功能。 0x02 漏洞概述 易宝OA ExecuteSqlForSingle接口处存在SQL注入漏洞&a…

qt 5.15.2压缩和解压缩功能

qt 5.15.2压缩和解压缩功能 主要是添加qt项目文件.pro内容: 这里要先下载quazip的c项目先编译后引入到本项目中/zip目录下 INCLUDEPATH ./zip CONFIG(debug, debug|release) {win32:win32-g: PRE_TARGETDEPS $$PWD/zip/libquazipd.awin32:win32-g: LIBS -L$$PWD…

基于Netty的网络调用实现

作为一个分布式消息队列,通信的质量至关重要。基于TCP协议和Socket实现一个高效、稳定的通信程序并不容易,有很多大大小小的“坑”等待着经验不足的开发者。RocketMQ选择不重复发明轮子,基于Netty库来实现底层的通信功能。 1 Netty介绍 Net…

【pytorch】深度学习入门一:pytorch的安装与配置(Windows版)

请支持原创,认准DannisTang(tangweixuan1995foxmail.com) 文章目录 第〇章 阅读前提示第一章 准备工作第一节 Python下载第二节 Python安装第三节 Python配置第四节 Pycharm下载第五节 Pycharm安装第六节 CUDA的安装 第二章 Anaconda安装与配…

Gitee 之初体验(上)

我们在项目开发或者自己学习的时候,总会存在这样的问题: 在一台电脑上编写完代码,想要再另外一台电脑上再去写,再或者和其他人一起协作等等场合,代码传来传去很麻烦。 这个时候,我们就可以去使用代码管理工…

LeetCode刷题---打家劫舍问题

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、打家劫舍 题目链接:打家劫舍 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定…

Spring Security 6.x 系列(7)—— 源码分析之建造者模式

一、建造者模式 WebSecurity、HttpSecurity、AuthenticationManagerBuilder 都是框架中的构建者,把他们放到一起看看他们的共同特点: 查看AuthenticationManagerBuilder的继承结构图: 查看HttpSecurity的继承结构图: 查看WebSec…

数据结构(超详细讲解!!)第二十六节 图(上)

1.基本概念 图(Graph)是一种较线性表和树更为复杂的非线性结构。是对结点的前趋和后继个数不加限制的数据结构,用来描述元素之间“多对多”的关系(即结点之间的关系是任意的)。 一个图G (V,E)由顶点&…

excel 计算断面水质等级

在工作中遇到根据水质监测结果要判断断面等级。写了下面的公式: 因子标准值 limits {COD: [15,15, 20, 15,20],氨氮: [0.15, 0.5, 1, 1.5, 2.0],总磷: [0.02, 0.1, 0.2, 0.3, 0.4] } excel公式: IFS(MAX(IF(M2>20,1,0), IF(N2>2,1,0), IF(O2&g…

RabbitMQ登录控制台显示--你与此网站的连接不是私密连接

一、RabbitMQ默认账号 Note: The default administrator username and password are guest and guest. 注:默认管理员用户名和密码为guest和guest 二、自己修改过或者注册的情况 由于本人之前用过,注册过账号密码,在登录时,用户名账号有异常出现以下问题 解决方案: 因为我的rab…

AI - Steering behaviorsII(碰撞避免,跟随)

Steering Behaviors系统中的碰撞避免,路径跟随,队长跟随 Collision Avoid 在物体前进的方向,延伸一定长度的向量进行检测。相当于物体对前方一定可使范围进行检测障碍物的碰撞 延伸的向量与碰撞物圆心的距离小于碰撞物的半径,则…

计算机体系结构----流水线技术(三)

本文仅供学习,不作任何商业用途,严禁转载。绝大部分资料来自----计算机系统结构教程(第二版)张晨曦等 计算机体系结构----流水线技术(三) 3.1 流水线的基本概念3.1.1 什么是流水线3.1.2 流水线的分类1. 部件级流水线、处理机级流…