#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. 第二项目AIaisell(易销宝)
  2. 5 月书讯 | 程序员的历史课,是时候补补了
  3. WINCE6.0组件选择说明
  4. vscode 在标签的src引入别名路径_从零开始 - VSCode 插件运行机制
  5. html给按钮设置背景,设置按钮背景图片(HTML-CSS)
  6. 谷歌2007年上交大考试最后一题解答
  7. php gridview,PHP编程:yii2-GridView在开发中常用的功能及技巧总结
  8. 二叉搜索树的公共祖先,二叉树的最近公共祖先
  9. html和css页面自动缩小和放大,如何使用CSS和Javascript来缩小HTML?
  10. thinkphp5项目--企业单车网站(二)
  11. 《腾讯iOS测试实践》一一1.8 小结
  12. centos安装输入法
  13. Google Test使用简介
  14. go多版本管理之gvm
  15. java单例模式_无名小仙男
  16. 「IT基础」计算机网络概述
  17. DB2缓冲池、表空间详解
  18. 蓝桥杯javaB三羊献瑞
  19. 2022国际数维杯C题思路
  20. Matrix Admin html5网站管理后台源码 Bootstrap响应式模板主题

热门文章

  1. 2.2 PPT封面练习(3)
  2. 弘辽科技:拼多多账号注销后还能再次开店吗?
  3. 怎么获取红米Note 4X的Root权限
  4. 绝对值编码器常见的故障有哪些 如何处理
  5. Hexagon cDSP芯片简介
  6. Direct3D Devices
  7. 阿里云存储价格对象存储OSS、文件存储NAS和块存储收费标准
  8. 十进制转换为十六进制(转载过来的)
  9. 算法图解第十、十一章读书笔记
  10. 牛客网 - [牛客假日团队赛5]金币馅饼(dp)