#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.csdn.net/weixin_42142612/article/details/80972768
2.

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

  1. MATLAB 傅里叶普和相角,傅里叶变换在MATLAB中傅里叶系数相位角计算pwelch和cspd使用...

    本帖最后由 多多会迈特来布 于 2016-2-11 05:59 编辑 我现在是需要用水力学的一个叫做Mansard&Funike的方法来做波浪反射分析,就是通过得到的三个位置随时间变化的水面高 ...

  2. 单频信号的相位谱计算与误差修正-附Matlab代码

    一.问题描述 我们在实际处理时经常遇到只有一个正弦信号的情况,其频率为 f 0 {{f}_{0}} f0​,在谱分析以后,除了在频率为 f 0 {{f}_{0}} f0​处有相位数值外,其他频率处都有 ...

  3. 边缘检测拉普拉斯c语言,如何用 OpenCV、Python 和拉普拉斯算子来计算图片中的模糊量...

    在刚刚过去的这个周末,我坐下来想在 iphoto 中整理这些海量的照片.这不仅仅意味着巨大的工作量,因为我很快注意到一个现象--其中充斥着大量模糊的照片. 主要因为我的摄影技术比较low,Jemma又 ...

  4. 使用Python,Opencv进行二维直方图的计算及绘制

    使用Python,Opencv进行二维直方图的计算及绘制 1. 效果图 2. 源码 参考 这篇博客将介绍如何使用Python,Opencv进行二维直方图的计算及绘制(分别用Opencv和Numpy计算 ...

  5. GPS接收机(二)圆极化天线仿真—场路协同仿真和相位中心计算

    简介 圆极化波受多径效应和极化畸变的影响较小,对接收天线没有严苛的摆放姿态要求,因而一般在卫星通信系统中采用圆极化天线作为收发天线. 球形四臂螺旋天线仿真 天线模型 天线驻波 球形四臂螺旋天线的驻波如 ...

  6. 【OpenCV】中的鱼眼相机及其标定

    1. 鱼眼镜头特性与镜头分类 普通镜头和针孔相机在数学模型上可以等价对待,都是射影变换(Perspective transform): 鱼眼镜头受到水下斯涅耳窗口现象的启发,采用不同的投影方式,来得到 ...

  7. 【电源设计】08电源中电容大小的计算

    0.前言 本章主要介绍电容相关知识以及其在电源电路中的应用与计算. 本文同时作为<[元器件]5.电容>章节. 文章目录 0.前言 1.电容的基础知识 1.1电容是什么? 1.2电容器的工作 ...

  8. 利用OpenCV的函数mean()和meanStdDev()计算图像的均值和标准差

    利用OpenCV的函数mean()和meanStdDev()计算图像的均值和标准差 函数mean()的原型和介绍如下: 函数meanStdDev()的原型和介绍如下: 可见,这两个函数的使用是很简单的 ...

  9. OpenCV傅里叶变换

    文章目录 傅里叶概念 傅里叶的介绍 傅里叶变换的作用 傅里叶滤波 OpenCV傅里叶变换的实际应用 函数介绍 代码展现 傅里叶概念 傅里叶的介绍 傅立叶变换,表示能将满足一定条件的某个函数表示成三角函 ...

最新文章

  1. 大div套多个小div,怎样设置外div的高度自适应?
  2. 神经网络迭代次数的线性累加现象
  3. Vue通过eventBut实现组件全局通信
  4. c++算术溢出_二进制安全之堆溢出(系列)——CTF环境配置
  5. [pytorch、学习] - 3.11 模型选择、欠拟合和过拟合
  6. java 动态获取IP地址(城市)
  7. 视觉SLAM笔记(49) 后端状态估计
  8. ina3221嵌入式linux,嵌入式Linux之我行——Linux-2.6.30.4在2440上的移植之文件系统
  9. Linux系统与网络服务管理技术大全(第2版)
  10. 智慧旅游和智慧景区建设实施方案
  11. 计算机病毒教学评课,计算机病毒评课稿样稿.doc
  12. 数据结构之图的基本介绍
  13. 老师给我推荐的经典管理书籍
  14. 时间同步软件和相关网站
  15. 50个程序员必须知道的网站,你知道么
  16. 云展网教程 | 云展网电子杂志页面排版最佳尺寸,最佳字体,字号
  17. 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记(转)...
  18. vue路由传参—params—query
  19. Unity如何设计一个技能系统
  20. 一款好看404页面|HTML-404模板

热门文章

  1. 唐天下文化传播:惹火2021公司新年年会,天下谁人不识君?
  2. 程序员应该掌握的统计学公式
  3. 如何在 ActiveX 控件中使用字体
  4. 从法学生到坐拥两千万抖音粉丝,贫穷料理是如何一步步成为美食类顶流的?
  5. uestudio 14 注册机 绿色免费版
  6. matlab 数组索引必须为正整数或逻辑值
  7. Direct3D Devices
  8. 【HNOI 2012】永无乡
  9. 统计学基本概念:均值、方差、标准差、协方差
  10. Ionic + Vue3 + Capacitor 配置环境、打包应用常见问题