opencv:傅里叶变换中的相位的计算

傅里叶变换后信号的频谱分析中相位角的求法 信号表示为三角傅里叶级数时: 以上为进行三角分解后的初步结果,要进行信号的频谱分析还需要将括号内的三角函数合并为余弦的形式。 此处An和相位角的求法如下: 而对于指数形式的傅里叶变换结果该如何呢? 固然,直接用傅里叶变换积分来求是一种办法: 但是若此时已经求出三角形式的变换结果了,要转化为指数形式该如何做呢? 可以根据欧拉公式分解: 例如: 此式要转化成指数形式,则: 问题来了,你怎么知道那个ψn是咋求的啊?这时就不能按照那个前面三角变换中的公式求了,要和复变函数的解法统一起来(用到的知识是 阅读详情
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;

//快速傅里叶变换
void fft2Image(InputArray _src, OutputArray _dst)
{
	//得到Mat类型
	Mat src = _src.getMat();
	//判断位深
	CV_Assert(src.type() == CV_32FC1 || src.type() == CV_64FC1);
	CV_Assert(src.channels() == 1 || src.channels() == 2);
	int rows = src.rows;
	int cols = src.cols;
	//为了进行快速的傅里叶变换,我们经行和列的扩充,找到最合适扩充值
	Mat padded;
	int rPadded = getOptimalDFTSize(rows);
	int cPadded = getOptimalDFTSize(cols);
	//进行边缘扩充,扩充值为零
	copyMakeBorder(src, padded, 0, rPadded - rows, 0, cPadded - cols, BORDER_CONSTANT, Scalar::all(0));
	//快速的傅里叶变换(双通道:用于存储实部 和 虚部)
	dft(padded, _dst, DFT_COMPLEX_OUTPUT);
}


//求傅里叶变换的幅度谱 amplitude spectrum
void amplitudeSpectrum(InputArray _srcFFT, OutputArray _dstSpectrum)
{
	//判断傅里叶变换是两个通道
	CV_Assert(_srcFFT.channels() == 2);
	//分离通道
	vector<Mat> FFT2Channel;
	split(_srcFFT, FFT2Channel);
	//计算傅里叶变换的幅度谱 sqrt(pow(R,2)+pow(I,2))
	magnitude(FFT2Channel[0], FFT2Channel[1], _dstSpectrum);
}
//傅里叶谱的灰度级显示
Mat graySpectrum(Mat spectrum)
{
	Mat dst;
	log(spectrum + 1, dst);
	//归一化
	normalize(dst, dst, 0, 1, NORM_MINMAX);
	//为了进行灰度级显示,做类型转换
	dst.convertTo(dst, CV_8UC1, 255, 0);
	return dst;
}
//求相位谱 phase spectrum
Mat phaseSpectrum(Mat _srcFFT)
{
	//相位谱
	Mat phase;
	phase.create(_srcFFT.size(), CV_64FC1);
	//分离通道
	vector<Mat> FFT2Channel;
	split(_srcFFT, FFT2Channel);
	//计算相位谱
	for (int r = 0; r<phase.rows; r++)
	{
		for (int c = 0; c < phase.cols; c++)
		{
			//实部 虚部
			double real = FFT2Channel[0].at<double>(r, c);
			double imaginary = FFT2Channel[1].at<double>(r, c);
			// atan2 的返回值范围 [0,180] [-180,0]
			// Computes the arc tangent of y/x using the signs of arguments to determine the correct quadrant.
			phase.at<double>(r, c) = atan2(imaginary, real);
		}
	}
	return phase;
}
int main(int argc, char*argv[])
{
	//输入图像
	Mat img = imread("./basketBall.jpg", 0);
	if (!img.data)
		return -1;
	//将图像转换为浮点型
	Mat fImg;
	img.convertTo(fImg, CV_64FC1, 1.0, 0);
	//乘以 -1^(r+c)
	int rows = fImg.rows;
	int cols = fImg.cols;
	for (int r = 0; r < rows; r++)
	{
		for (int c = 0; c < cols; c++)
		{
			if ((r + c) % 2)
				fImg.at<double>(r, c) *= -1;
		}
	}
	//快速傅里叶变换
	Mat fft2;
	fft2Image(fImg, fft2);
	//傅里叶变换的幅度谱
	Mat ampSpec;
	amplitudeSpectrum(fft2, ampSpec);
	//幅度谱的灰度级显示
	Mat graySpec = graySpectrum(ampSpec);
	imshow("幅度谱的灰度级显示", graySpec);
	//相位谱
	Mat phaSpec = phaseSpectrum(fft2);
	//相位谱的灰度级显示
	imshow("相位谱", phaSpec);
	waitKey(0);
	return 0;
}
//求相位谱 phase spectrum
Mat phaseSpectrum(Mat _srcFFT)
{
	//相位谱
	Mat phase;
	phase.create(_srcFFT.size(), CV_64FC1);
	//分离通道
	vector<Mat> FFT2Channel;
	split(_srcFFT, FFT2Channel);
	//计算相位谱
	for (int r = 0; r<phase.rows; r++)
	{
		for (int c = 0; c < phase.cols; c++)
		{
			//实部 虚部
			double real = FFT2Channel[0].at<double>(r, c);
			double imaginary = FFT2Channel[1].at<double>(r, c);
			// atan2 的返回值范围 [0,180] [-180,0]
			// Computes the arc tangent of y/x using the signs of arguments to determine the correct quadrant.
			phase.at<double>(r, c) = atan2(imaginary, real);
		}
	}
	return phase;
}

其中用虚部除以实部,来做相位角度的计算。
在这里插入图片描述

参考博客:
1.opencv 中的atan2(y,x)的具体实现。https://blog.youkuaiyun.com/weixin_42142612/article/details/80972768
2.

OpenCV学习06_离散傅里叶变换 一、时域和频域 1.1 时域 时域(时间域)——自变量是时间,即横轴是时间,纵轴是信号的变化。其动态信号x(t) 是描述信号在不同时刻取值的函数。 图1是正弦波的时域图,示出了振幅与时间的关系。 在时域图中,横轴是时间,纵轴是振幅。时域图显示振幅随时间的变化,可以看出峰值振幅为5V,可以算出频率f=6 Hz。 1.2 频域 频域(频率域)——自变量是频率,即横轴是频率,纵轴是该频率信号的幅度,也就是通常说的频谱图。 下面是图文讲解: 图2是图1中正弦波的频域图。 在频域图中,横轴是频率,纵轴 阅读详情

相关推荐

信号处理之FFT(如何求幅度、相位、画频谱图)

介绍如何利用FFT求信号的幅度和相位、以及绘制频谱图(附matlab代码)

LHY188166的博客 2万+

matla图像b傅里叶逆变换_傅里叶变换学习笔记(10)

我们考虑傅里叶变换的一个应用:光的衍射背景假设光产生于无穷远处的光源,到达带有光阑的光屏(称为源光屏)。光在距离源光屏一定距离的屏(称为接收屏)上产生具有一定特征的条纹。相对于波长,到接受屏的距离较小时称为近场衍射,也称菲涅尔衍射,相对应的是远场衍射,也称夫琅禾费衍射。这里我们考虑的是远场衍射。远场衍射实际意味着衍射屏是一个波阵面 (a wave front),也就是说屏上的各点是同相位的。为了简...

weixin_39611037的博客 398

傅里叶变换之工业缺陷检测应用

在工业缺陷检测的场景中,我们经常会遇到一些难以直接通过空域方法进行检测的现象。如图所示,在进行织布赃污的检测时,由于脏污区域与周围像素点的灰度值相差较小,且脏污区域内的像素灰度值变化较大,因此很难选择合适的阈值来进行图像二值化,从而确定脏污区域。此时,我们就要在频域内对图像进行处理。通过频域滤波,滤除掉频率较低的成分(无脏污部分)和频率较高的成分(织布纹理图案部分),即可得到脏污区域的图像。

我的博客 2535

深入浅出理解傅里叶变换真正含义

小白也可以深入理解傅里叶变换

qq_49613557的博客 943

OpenCV C++二维傅里叶谱和相角阵列

傅里叶变换  二维DFT的极坐标表示  幅度或频率谱为 R(u,v)和I(u,v)分别是F(u,v)的实部和虚部  相角或相位谱为 ...

cyf15238622067的博客 1744

基于相位相关匹配法的显微图像拼接:OpenCV C++实战解析

本文详细解析了基于相位相关匹配法的显微图像拼接技术,并提供了OpenCV C++实战代码。该方法利用傅里叶变换在频域计算图像间的平移偏移量,具有计算速度快、对光照变化不敏感的优点,能有效解决因机械误差导致的图像错位问题,是实现高精度全景显微图像合成的关键技术。

weixin_29267307的博客 369

【OpenCV】图像傅里叶变换

傅里叶变换(Fourier Transform)是一种将时间域或空间域中的信号转换为频率域表示的数学工具。在图像处理中,二维离散傅里叶变换(2D-DFT, Two-Dimensional Discrete Fourier Transform)被广泛应用于频域滤波、图像压缩、特征提取等领域。OpenCV 提供了执行傅里叶变换的功能,使得开发者能够方便地对图像进行频域分析和操作。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 3446

OpenCV展开相位图编程

总结起来,展开相位图是一种重要的图像处理技术,可以用于光学干涉图像的相位信息提取。通过适当的图像预处理和参数调整,我们可以获得准确的物体表面形状信息,从而在许多应用中发挥重要作用。在计算机视觉和图像处理领域,OpenCV是一个广泛使用的开源库,提供了许多功能强大的图像处理工具和算法。其中之一是展开相位图,这是一种常用的技术,用于从光学干涉图像中提取相位信息。需要注意的是,展开相位图是一项复杂的任务,可能需要更多的预处理步骤和参数调整来获得最佳的结果。展开相位图是一种将相位信息从原始图像中提取出来的方法。

CyberXZ的博客 318

傅里叶变换【2】:傅里叶幅度谱与相位谱

//快速傅里叶变换 void fft2Image(InputArray _src, OutputArray _dst) { //得到Mat类型 Mat src = _src.getMat(); //判断位深 CV_Assert(src.type() == CV_32FC1 || src.type() == CV_64FC1); CV_Assert(src.channels() == 1...

Ring__Rain的博客 1万+

深度探索图像处理中的离散傅里叶变换

在OpenCV中,DFT操作通过dft()函数实现,其函数原型如下:这里,src是输入的复数或实数数组,dst是输出数组,其大小和类型与输入数组相同。flags参数指定变换的类型和大小,参数指定非零行数。频域图像中的相位信息表示的是信号各频率成分相对于时间原点的位置。它相当于描述了信号波动的“相位角度”,可以反映图像中不同频率成分之间的相位关系。在图像处理中,相位信息往往对于理解图像的结构和形态特征至关重要。

weixin_33480380的博客 1014

国产HDMI2.0芯片GSV2011怎么选?手把手教你用它设计音视频采集卡(附FPGA/海思对接指南)

本文详细解析国产HDMI2.0芯片GSV2011在音视频采集卡设计中的应用,涵盖芯片选型、硬件设计要点及与FPGA/海思平台的对接指南。GSV2011凭借4K@60Hz支持、音频提取嵌入功能和高集成度,成为音视频设备的核心选择,助力开发者快速实现高性能采集卡设计。

weixin_30181209的博客 331

自然图像的傅里叶变换与分析 代码示例

该代码展示了图像频域处理的核心操作:对Lena和Baboon图像进行灰度转换后,通过FFT计算频谱并分离振幅/相位谱,实现低通/高通滤波。通过交换两幅图像的振幅和相位谱,验证了相位信息对图像重建的关键作用。实验结果表明,相位谱主导了图像的结构特征,而振幅谱主要影响对比度。所有处理结果均可视化保存,包括原始频谱、滤波后的频谱和重建图像。

彬彬侠的博客 1349

出个AI8051U的PWM例程 | 3相互补SPWM变频驱动,PWMA-3个相位差120度的PWM互补输出

通道2输出: P2.2, PWMA2P输出, P2.3, PWMA2N输出, PWMA2相对PWMA1滞后120度相位.通道3输出: P2.4, PWMA3P输出, P2.5, PWMA3N输出, PWMA3相对PWMA1滞后240度相位.先别修改程序, 直接下载"Objects"里的"pwm.hex"测试, 下载时选择主频24MHz.主频32.768MHz, PWM周期1422, 刷新频率23040Hz,死区0.5us,通道1输出: P2.0, PWMA1P输出, P2.1, PWMA1N输出。

USB_CAN_8051的博客 689

【OpenCV】OpenCV基础教程(9)—— 傅里叶变换

9. 傅里叶变换 9.1 二维离散的傅里叶(逆)变换 9.1.1 离散傅里叶变换 二维离散傅里叶变换的原理略,具体见书P346。 OpenCV实现傅里叶(逆)变换的函数: void cv::dft(cv::InputArray src, cv::OutputArray dst, int flags = 0, int nonzeroRows = 0) src:输入矩阵,只支持 CV_32F 或者 CV_64F 的单通道或双通道矩阵 dst:输出矩阵 flags:用于说明是傅里叶变换还是傅里叶逆变换 D

Quentin的博客 5213

Windows Server+SqlServer Always On实战:5步搞定高可用集群搭建

本文详细介绍了在Windows Server环境中,通过5个关键步骤搭建SQL Server Always On高可用集群的实战指南。内容涵盖从底层故障转移集群配置、SQL Server实例启用Always On功能,到创建可用性组和侦听器的完整流程,并提供了核心运维与故障排查思路,帮助企业构建稳定可靠的数据库高可用架构。

milk5的博客 857

告别命令行恐惧!用nTopology可视化工具5分钟搞定三维Voronoi泡沫建模

本文介绍如何利用nTopology可视化工具快速生成三维Voronoi泡沫结构,无需编程即可完成复杂建模。Voronoi结构在轻量化设计、能量吸收和生物医学等领域具有重要应用,传统命令行方法门槛较高。通过nTopology的四步流程,用户可在5分钟内创建仿真就绪模型,大幅提升设计效率。

weixin_30764771的博客 425

图像的傅里叶变换(opencv)

对于非数学专业的人来说,理解图像的傅里叶变化真的是一件很困难的事情,刚开始满头雾水的我疯狂的在网上找文章,功夫不负有心人,我找到了这个: https://www.cnblogs.com/h2zZhou/p/8405717.html 真的是非数学专业的救命草啊!!!! 理解了傅里叶变换的原理之后就需要自己动手实现了 图像经过基础的傅里叶变换得到的矩阵元素是复数类型,从复数矩阵中得到每个元素的...

luoluo3664的博客 1891

为什么大语言模型推理要分成 Prefill 和 Decode?深入理解这两个阶段的真正意义

Prefill 阶段是语言模型推理中的第一个步骤,它负责处理你输入的所有上下文内容(prompt),为后续生成打下基础。“请解释一下 Transformer 的原理。这句话会被 tokenizer 编码为一串 token,比如["请", "解释", "一下", "Trans", "##former", "的", "原理", "。"]。然后这些 token 会进入 Transformer 模型进行前向传播。重点来了 👇。

Harry的博客 1万+

OpenCV自学笔记十七:傅里叶变换

傅里叶变换(Fourier Transform)是一种将信号从时域转换到频域的数学变换。它将一个连续或离散的时域信号分解为一组正弦和余弦函数的复合。在Python中,可以使用NumPy库来实现傅里叶变换。具体步骤如下:2. 准备输入信号数据,可以是离散的时间序列数据或连续的函数。这将返回一个复数数组`X`,其中包含了信号在频域的表示。4. 对结果进行频谱转换,得到幅度谱和相位谱。5. 可选:对频域信号做其他处理。

m0_71721954的博客 647

在MATLAB中将C语言代码转化为可执行的mexw64文件

这样,您可以将高效的C语言算法集成到MATLAB环境中,以便更好地利用MATLAB的功能和特性。请记住,在使用mex转换C语言代码之前,您需要正确编写和测试C语言代码,并确保它与MATLAB的mex接口兼容。MATLAB是一种功能强大的数值计算软件,它提供了一个机制,可以将C语言代码转化为MATLAB可执行的mexw64文件。在上述命令中,"-output"选项指定生成的mex文件的名称,"myfunction"是您选择的名称,"myfunction.c"是要编译的C语言源文件。步骤1:编写C语言代码。

CodeRoarX的博客 1427

LLC型自驱动半桥谐振变换器:电压电流变化与自然换向解析

变换器的工作状态经历了多个阶段,从模态一的关断状态,到模态二和三的电流供电状态,每个阶段都得到了合理的设计和优化。的工作原理,尤其是在半个周期内的电压和电流变化。上图 展示了该变换器在工作时的电压和电流波形,它为我们揭示了变换器如何通过精确的电流和电压控制,优化性能并实现高效能转换。,并根据负载情况调整电流和电压的工作模式,能够极大提升变换器的效率,尤其是在零电压开通和自然换向的设计中,发挥着关键作用。这意味着,电流会随着时间周期的变化,呈现典型的振荡波形,从而达到良好的电流控制。是两个关键的电流变量。

weixin_43199439的博客 279

图像的傅里叶变换与频谱分析

【代码】图像的傅里叶变换。

2301_81167606的博客 127

HarmonyOS应用开发者基础认证

B. 自定义组件:可复用的 UI 单元,可组合其它组件。D. 内置组件:ArkTS中默认内置的基本组件和布局组件,开发者可以直接调用,如Column、Text、Divider、Button等。E. 属性方法:用于组件属性的配置,统一通过属性方法进行设置,如fontSize()、width()、height()、color() 等。在Column和Row容器组件中,justifyContent用于设置子组件在主轴方向上的对齐格式,alignItems用于设置子组件在交叉轴方向上的对齐格式。

牛肉胡辣汤 3813

Opencv之谱残差显著性检测

学习资料参考: 张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017. 前言 在使用谱残差进行显著性检测之前,我们需要理解两个概念,分别是幅度谱和相位谱。 幅度谱和相位谱是将图片进行傅里叶正向变换之后得到的结果。幅度谱表示的是每个正弦波的最大幅度值,相位谱表示的是每个正弦波的相位(当然需要选定一个基点)。 原理 图像的傅里叶变换是由幅度谱和相位谱表示的,即通过幅度谱和相位谱可以还原图像。而显著性检测就是通过调整幅度谱和相位谱显示显著目标。 操作步骤 计

计算机科学与技术专业学生的成长之路 2119

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

opencv显示图像的频谱图(C++)

opencv显示图像的频谱图(C++)1. 图像傅里叶变换2. 幅度谱3.相位谱4. 测试 1. 图像傅里叶变换 图像的傅里叶变换是二维的傅里叶变换,二维离散傅里叶变换(discrete Fourier transform,DFT)定义式如下: 在这里f(m,n)f(m,n)f(m,n)为图像在点(i,j)(i,j)(i,j)的像素值。 二维离散傅里叶反变换为: 在opencv中可以通过dft()函数实现二维离散傅里叶变换,代码如下: Mat DFT::dft2(Mat input) { if (in

qq_45267848的博客 4265

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

OpenCV笔记19 Fourier Tranformation

一、简介 图像处理可分为两个部分,空间域(时域)和频域。空间域是直接对图像的像素处理,可以划分为灰度变换和滤波两种方式,灰度变化就是对单一像素的灰度值进行调整,而滤波是对整张图像而言的...

weixin_39354845的博客 3262

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: sklearn:卡方分布输入不能是负数
下一篇: 傅里叶变换中一些细节
dlvector
博客等级 码龄10年 85粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值