[激光原理与应用-126]:傅里叶变化与频域分析

news2024/11/24 13:50:57

目录

一、什么是傅里叶变换

1.1 基本概念

(1)首先,先看时域图像:

(2)接下来,频域波形

(3)傅里叶变换

1.2 应用

(1)离散傅里叶变换在图像处理领域的应用:

二、代码编写:傅里叶变换与逆傅里叶变换

2.1 、OpenCV实现傅里叶变换

2.2 OpenCV实现逆傅里叶变换

2.3 Numpy实现傅里叶变换

2.4、Numpy实现逆傅里叶变换

三、应用实践:低通滤波与高通滤波

3.1 低通滤波:滤除高频分量 ——模糊图像(使用OpenCV)

3.2 高通滤波  ——滤除低频分量 - 锐化图像(使用OpenCV)


一、什么是傅里叶变换

1.1 基本概念

傅里叶原理表明:任何连续测量的时序或信号(时域信号),都可以表示为不同频率正弦波信号无限叠加(积分)。也就是说,傅里叶变换是一种特殊的积分变换,它能将满足一定条件的某个函数(时域信号)表示成正弦基函数线性组合或者积分

不同的研究领域,傅里叶变换具有多种不同的变体形式,如连续傅里叶变换离散傅里叶变换

(看一张动态图,原作者: 傅里叶分析之掐死教程(完整版)更新于2014.06.06 - 知乎) (动态图的开始部分很清晰的展现了:红色曲线可以由众多条(或者无数条)蓝色的正弦函数以及余弦函数叠加而成)
(再看一张老面孔) 在数字图像领域,我们一般使用的都是二维的灰度图像,所以这里从二维的傅里叶变换说起。

(1)首先,先看时域图像:

他是我们经常见到与接触的一种函数(方波信号),称它为 f(t):


从大图中可以看到,这条线是由所有的正弦波叠加而成的总和,反过来说就是,所有的正弦波都是这条总和波的分量。其中,频率最低的排在最前面,越往后,频率越高(即上下跳动越活越),并且,每一条波的振幅都不同(因为波形的高度不同)。同时,我们也发现在所有的正弦波中,有很多分量是直线,那是因为时域图像中的 f(t) 并不需要某种特定频率的正弦波,所以表现为直线。

(2)接下来,频域波形

我们从正弦波的侧面看过去,便是 f(t) 在频域的样子(终于到这一步了)

在频域上,自变量为正弦波分量的频率,因变量为振幅,他们两形成的函数 F(w),也就是频域图像。这时,一个时域——频域的映射就完成了。

(3)傅里叶变换

让我们在回顾一下文章开头的动图的最后一张:

由 时域上的红色图像 映射到了 频域上的蓝色图像,这便是傅里叶变换所做的事。

1.2 应用

(1)离散傅里叶变换在图像处理领域的应用:

对于数字图像这种离散的信号,频率大小表示信号变化的剧烈程度或者说是信号变化的快慢
频率越大,变化越剧烈,频率越小,信号越平缓。

对应到图像中,高频信号往往是图像中的边缘信号和噪声信号,而低频信号包含图像变化缓慢的图像轮廓及背景等信号。

因此,我们可以做相应的锐化和模糊的处理:提出其中的高频分量做傅里叶逆变换得到的就是锐化的结果(高通滤波器)。 提出其中的低频分量做傅里叶逆变换得到的就是模糊的结果(低通滤波器)。

另外,需要特别注意的一点是:

截取频域图中的任何一个区域对应的都是原来的整张图的区域,而不是对应的局部区域。

二、代码编写:傅里叶变换与逆傅里叶变换

【Numpy与OpenCV均可实现傅里叶变换与逆傅里叶变换】

2.1 、OpenCV实现傅里叶变换

OpenCV API:

dst = cv2.dft (src , flags)

参数:

src:输入图像,需要转换格式为np.float32,可以为实数矩阵或者复数矩阵
flags:转换标志
(如DFT_COMPLEX_OUTPUT,对一维或二维实数数组正变换,输出一个同样尺寸的复数矩阵)
(DFT_REAL_OUTPUT,对一维或二维复数数组反变换,通常输出同样尺寸的复矩阵)
返回结果:是双通道的,第一个的结果是虚数部分,第二个通道的结果是实数部分
其他函数:

np.fft.fftshift(dst):将图像的低频部分移动到图像的中心
返回值 = cv2.magnitude(参数1, 参数2)——将复数结果转换为幅值
参数1:浮点型X坐标值,也就是实部
参数2:浮点型Y坐标值,也就是虚部

【代码编写】

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 以灰度形式读入
img = cv2.imread('img\qiqiqi.png', 0)

# 使用cv2.dft()进行傅里叶变换
dst = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)

# 将变换后图像的低频部分转移到图像的中心(低频信号在原点)
dst_center = np.fft.fftshift(dst)

# 使用cv2.magnitude将实部和虚部转换为实部,乘以20是为了使得结果更大
result = 20 * np.log(np.abs(cv2.magnitude(dst_center[:, :, 0], dst_center[:, :, 1])))

# 显示图像
plt.subplot(121)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.subplot(122)
plt.axis("off")
plt.imshow(result, cmap="gray")
plt.show()


2.2 OpenCV实现逆傅里叶变换

OpenCV API

dst= cv2.idft(src)

参数:

src:经过傅里叶变换后的图片
其他函数:

(同 【一、OpenCV实现傅里叶变换】)

【代码编写】

# %%opencv实现逆傅里叶变换
# 以灰度形式读入
img = cv2.imread('img\qiqiqi.png', 0)

# 使用cv2.dft()进行傅里叶变换
dst = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)

# 将变换后图像的低频部分转移到图像的中心
dst_center = np.fft.fftshift(dst)

#
# 中间可以定义相应的掩膜去留高频或者低频部分
#

# 使用np.fft.ifftshift将低频移动到原来的位置
dst_origin = np.fft.ifftshift(dst_center)

# 使用cv2.idft进行傅里叶的逆变化
img_idft = cv2.idft(dst_origin)

# 使用cv2.magnitude转化为空间域内
img_idft = cv2.magnitude(img_idft[:, :, 0], img_idft[:, :, 1])

# 显示图像
plt.subplot(121)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.title('原图')
plt.subplot(122)
plt.axis("off")
plt.imshow(img_idft, cmap=plt.cm.gray)
plt.title('逆傅里叶变换')
plt.show()


2.3 Numpy实现傅里叶变换

Numpy

np.fft.fft2(img)

参数:

img:输入的灰度图像
其他函数:

(可参照 【一、OpenCV实现傅里叶变换】)

【代码编写】

# %%NumPy实现傅里叶变换
img = cv2.imread('img//qiqiqi.png', 0)

# 使用Numpy进行傅里叶变换
f = np.fft.fft2(img)

# 无处理(未把零频率分量移到中间)
mid_result = 20 * np.log(np.abs(f))

# 把零频率分量移到中间
fshift = np.fft.fftshift(f)
result = 20 * np.log(np.abs(fshift))

# 显示图像
plt.subplot(131)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.title('原图')
plt.subplot(132)
plt.axis("off")
plt.imshow(mid_result, cmap=plt.cm.gray)
plt.title('Numpy傅里叶变换\n(未把零频率分量移到中心)')
plt.subplot(133)
plt.axis("off")
plt.imshow(result, cmap=plt.cm.gray)
plt.title('Numpy傅里叶变换\n(把零频率分量移到中心)')
plt.tight_layout()
plt.show()


2.4、Numpy实现逆傅里叶变换

Numpy

np.fft.ifft2(img)

参数:

img:经过傅里叶变换后的图像
【代码编写】

# %%Numpy实现逆傅里叶变换
img = cv2.imread('img//qiqiqi.png', 0)

# 进行傅里叶变换
f = np.fft.fft2(img)

# 逆傅里叶变换
f_center = np.fft.ifftshift(f)
f_origin = np.fft.ifft2(f_center)

# 设置区间
f_origin = np.abs(f_origin)

# 显示图像
plt.subplot(121)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.title('原图')
plt.subplot(122)
plt.axis("off")
plt.imshow(f_origin, cmap=plt.cm.gray)
plt.title('Numpy逆傅里叶变换')
plt.show()


 

三、应用实践:低通滤波与高通滤波

3.1 低通滤波:滤除高频分量 ——模糊图像(使用OpenCV)

滤除突变的高频信号,留下渐变的低频信号。

【代码编写】

# %%OpenCV低通滤波
img = cv2.imread('img//qiqiqi.png', 0)

dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_center = np.fft.fftshift(dft)

# 定义掩模:生成的掩模中间为1周围为0
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2)  # 求得图像的中心点位置
mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1

# 将掩模与傅里叶变化后图像相乘,保留中间部分
mask_img = dft_center * mask

img_idf = np.fft.ifftshift(mask_img)
img_idf = cv2.idft(img_idf)
img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1])

plt.subplot(121)
plt.axis('off')
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.axis('off')
plt.imshow(img_idf, cmap='gray')
plt.show()

3.2 高通滤波  ——滤除低频分量 - 锐化图像(使用OpenCV)

去除低频的底噪和低频轮廓信号,留下突变的高频信号

【代码编写】

将低通滤波的定义的掩膜由 中间0周围1 改为 中间1周围0

复制 
# 定义掩模:生成的掩模中间为0周围为1
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得图像的中心点位置
mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 0

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

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

相关文章

Shell脚本格式化打印信息样例

以下是一个基于Centos7安装docker的脚本 logging.sh [rootbogon ~]# cat logging.sh #!/bin/bashNC\033[0m RED\033[31m GREEN\033[32m YELLOW\033[33m BLUE\033[34mlog::err() {printf "[$(date %Y-%m-%dT%H:%M:%S.%2N%z)][${RED}ERROR${NC}] %b\n" "$"…

美团2024年春招第一场笔试【前端移动端方向】编程题题解Java

1、小美的平衡矩阵 前缀和,时间复杂度为O(n^3) 对于每个矩形,已知边长k,只用每次遍历矩形的左上顶点,就可以确定整个矩形范围。然后统计该矩形中01的具体数量,判断是否相等。而这一步可以使用前缀和,建立数…

PN结--

文章目录 准备知识P型 N型半导体多子 少子(相关性质受温度影响程度的关键点) PN结的形成势垒 PN结的单向导通性正向偏置反向偏置 PN结的电流方程正向特性反向特性反向击穿反向击穿会把二极管搞坏吗 掺杂浓度与其宽度的关系 准备知识 P型 N型半导体 P型…

无人机之使用技巧篇

无人机使用技巧涉及多个方面,从起飞前的准备到飞行中的操控,再到降落后的维护,都需要掌握一定的技巧。以下是一些关键的无人机使用技巧: 一、起飞前准备 检查无人机:确保无人机完好无损,各部件连接牢固&a…

Adobe DC 2022提示无法识别的错误 - 解决方案

Adobe DC 2022提示无法识别的错误 - 解决方案 问题解决方案更改安装(推荐)重新安装(推荐)降级安装(不推荐) 问题 使用Adobe DC 2022合并图片创建PDF时,会提示无法识别的错误,这是因…

OrangePi AIpro 香橙派 昇腾 Ascend C算子开发 - 环境搭建

OrangePi AIpro 香橙派 昇腾 Ascend C算子开发 flyfish 环境搭建部分 OrangePi AIpro 香橙派的npu为310B4,通常配置的时候写 Ascend310B4 社区版资源下载地址 下载 CANN 这里选择的是 CANN 8.0.RC3.alpha002 异构计算架构CANN(Compute Architecture …

SpringMVC 笔记篇

2.1 ForkJoinPool底层原理分析 2.1.1 JDK19中的虚拟线程 首先注意要把项目切换成JDK19 首先我们这里有两个线程,一个是newFixedThreadPool,就是一个普通的线程池,另一个是我们的虚拟线程newVirtualThreadPerTaskExecutor。这里只有一个线程…

鸿蒙Harmony开发实战:线程异步JS 机制总结

背景介绍 回调函数是 JavaScript 中常见的一种编程模式,它在异步编程中起到了重要作用。在 NAPI (Node.js API)中,回调函数也被广泛应用,用于处理各种异步操作,例如文件读写、网络请求等。按照触发源或目的线程分为 JS 线程、C 线…

爬虫入门学习

流程 获取网页内容 HTTP请求 Python Requests解析网页内容 HTML网页结构 Python Beautiful Soup储存或分析数据 HTTP (Hypertext Transfer Protocol) 客户端和服务器之间的请求-响应协议 Get方法:获得数据 POST方法:创建数据 HTTP请求 请求行 方法类型…

HTML 总结

一、HTML概述 HTML 指的是超文本标记语言 超文本&#xff1a;是指页面内可以包含图片、链接、声音,视频等内容。标记&#xff1a;标签(通过标记符号来告诉浏览器网页内容该如何显示) 二、HTML的基本语法 1.Head标签 包含了所有的头部标签&#xff0c;例如&#xff1a;<t…

(一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)

ZSWatch是一个包括硬件、软件和3D打印外壳全部开源的智能手表&#xff0c;软件功能丰富&#xff0c;并可与手机互联用来接收信息和切换歌曲&#xff0c;开源协议为GPL-3.0。 因为ZSWatch建立在Zephyr™项目RTOS之上&#xff0c;因此得名ZSWatch- Zephyr&#xff0c;目前该项目…

金蝶云星空组织间结算清单增加自定义字段说明

单据增加字段 相关结算单增加&#xff0c;基础资料控件&#xff0c;映射资料。 业务单据-其他出库单增加字段 配置功能特性 创建结算清单 创建结算清单时&#xff0c;会生成到自定义字段上

【Qt】tcp服务器、tcp多线程服务器、心跳保持、服务端组包

文章目录 背景&#xff1a;代码实现&#xff08;服务端&#xff09;&#xff1a;总结改进方案&#xff1a;多线程tcp服务器代码实现&#xff08;服务端&#xff09;心跳保持&#xff1a;大文件收发 背景&#xff1a; 局域网内&#xff0c;客户端会进行udp广播&#xff0c;服务…

扩散模型(Diffusion Model)

扩散模型&#xff08;diffusion model&#xff09;是一种运用了物理热力学扩散思想的生成模型。扩散模型有很多不同的变形&#xff0c;本文主要介绍最知名的去噪扩散概率模型&#xff08;Denoising Diffusion Probabilistic Model&#xff0c;DDPM&#xff09;。如今比较成功的…

极狐GitLab 17.3 重点功能解读

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;可以私有化部署&#xff0c;对中文的支持非常友好&#xff0c;是专为中国程序员和企业推出的企业级一体化 DevOps 平台&#xff0c;一键就能安装成功。安装详情可以查看官网指南。 极狐GitLab 17.3 正式发布了多项与敏捷项目管…

波导阵列天线学习笔记4 一种用于毫米波通信的新型宽带双圆极化阵列天线

摘要&#xff1a; 在本文中&#xff0c;提出了一种新型的基于间隙波导毫米波双圆极化阵列天线。通过级联膜片极化器和十字转门OMT,简单的馈网被首次提出来实现双圆极化条件。通过膜片圆极化器可以在TE10和TE01模式之间实现90度的相位差&#xff0c;并且十字转门OMT被用于分别分…

【测试】——软件测试概念篇

&#x1f4d6; 前言&#xff1a;在软件开发过程中&#xff0c;需求分析和测试用例的设计是确保软件质量的关键步骤。本文将简要介绍用户需求与软件需求的区别、测试用例的定义及其重要性&#xff0c;以及如何设计有效的测试用例。 目录 &#x1f552; 1. 什么是需求&#x1f55…

Flink 1.14.*中flatMap,filter等基本转换函数源码

这里以flatMap&#xff0c;filter为例&#xff0c;介绍Flink如果要实现这些基本转换需要实现哪些接口&#xff0c;Flink运行时调用这些实现类的入口&#xff0c;这些基本转换函数之间的类关系 一、创建基本转换函数需要实现类继承AbstractRichFunction并实现特性接口1、RichFla…

甲基化组学全流程生信分析教程

甲基化组学全流程分析和可视化教程 读取数据目录下的idat文件的甲基化全流程一键分析 功能简介 甲基化分析模块可以实现甲基化芯片450K, 870kEPIC数据的自动读取&#xff0c;可以读取idat文件&#xff0c;也可以读取beta甲基化矩阵文件甲基化数据的缺失值插值甲基化数据的质…

【ArcGIS/GeoScenePro】Portal和Server关系

简介 上图简化后 三层 最上面:应用层 中间(门户):连接应用层和服务器,对server上发布的服务进行管理、分享和权限分配 最低面:服务器 例如:桌面想用server里的服务数据资源,需要通过portal去请求 Enterprise = portal(中间)+server(最底面层) 具体的Enterpri…