五、c++实现离散傅里叶变换
C++离散傅里叶变换
一、序言:
该教程基于之前的图像处理类MYCV,是对其的补充。
二、设计目标
对图像进行简单的离散傅里叶变换,并输出生成的频谱图。
三、需要提前掌握的知识
二维傅里叶变换公式:
四、详细步骤
1.首先定义一个方法,该方法对输入的图像进行傅里叶变换
输入:MyImage 源图像
输出:ComplexNu 进行离散傅里叶变换后的复数数组
定义:
static ComplexNumber* Dft2(MyImage const &Scr);
实现:
ComplexNumber* MyCV::Dft2(MyImage const &Scr) { int width = Scr.m_width; int height = Scr.m_height; // 将 scr_data 转化为灰度 MyImage *grayimage = Gray(Scr); unsigned char* gray_data = grayimage->m_data; int gray_bytesPerLine = grayimage->m_bytesPerLine; // 将 gray_data 转化为 double 型,并去掉用于填充的多余空间 double *double_data = new double[width*height]; for(int i=;i<height;i++) for(int j=;j<width;j++) { double_data[i*width+j]=(double)gray_data[i*gray_bytesPerLine+j]; } // 对 double_data 进行傅里叶变换 ComplexNumber *dft2_data = new ComplexNumber[width*height]; double fixed_factor_for_axisX = (- * PI) / height; // evaluate -i2π/N of -i2πux/N, and store the value for computing efficiency double fixed_factor_for_axisY = (- * PI) / width; // evaluate -i2π/N of -i2πux/N, and store the value for computing efficiency for (int u = ; u<height; u++) { for (int v = ; v<width; v++) { for (int x = ; x<height; x++) { for (int y = ; y<width; y++) { double powerX = u * x * fixed_factor_for_axisX; // evaluate -i2πux/N double powerY = v * y * fixed_factor_for_axisY; // evaluate -i2πux/N ComplexNumber cplTemp; cplTemp.m_rl = double_data[y + x*width] * cos(powerX + powerY); // evaluate f(x) * e^(-i2πux/N), which is equal to f(x) * (cos(-i2πux/N)+sin(-i2πux/N)i) according to Euler's formula cplTemp.m_im = double_data[y + x*width] * sin(powerX + powerY); dft2_data[v + u*width] = dft2_data[v + u*width] + cplTemp; } } } } // 返回傅里叶数组 return dft2_data; }
2.为了让傅里叶变换可视化,旭阳对其进行标准化和中性化
输入:ComplexNumber 离散傅里叶变换生成的复数数组
输出:MyImage 可视化后的图像
定义:
static MyImage* Dft22MyImage(ComplexNumber *Scr,int width,int height);
实现:
MyImage* MyCV::Dft22MyImage(ComplexNumber *Scr, int const width, int const height) { // 将傅里叶数组归一化 // 取模 double mold[width*height]; for(int i = ;i<width*height;i++) { mold[i] = Scr[i].get_mold(); } // 获取最小值 double min = mold[]; for(int i = ;i<width*height;i++) { if(mold[i]<min) min = mold[i]; } // 获取去掉前几大值的最大值 double maxqueue[] = {.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.},max; for(int i = ;i<width*height;i++){ if(mold[i]>maxqueue[]) maxqueue[] = mold[i]; } for(int j =;j<;j++){ for(int i = ;i<width*height;i++){ if(mold[i]>maxqueue[j]&&mold[i]<maxqueue[j-]) maxqueue[j] = mold[i]; } } max = maxqueue[]; unsigned char *normalized_data = new unsigned char[width*height]; for(int i=;i<height;i++) for(int j=;j<width;j++) { unsigned char t = (unsigned char)((mold[i*width+j]-min)/(max-min)*); if(t>) t = ; normalized_data[i*width+j]=t; } // 将图像中心化 unsigned char* center_data = new unsigned char[width*height]; for (int u = ; u<height; u++) { for (int v = ; v<width; v++) { if ((u<(height / )) && (v<(width / ))) { center_data[v + u*width] = normalized_data[width / + v + (height / + u)*width]; } else if ((u<(height / )) && (v >= (width / ))) { center_data[v + u*width] = normalized_data[(v - width / ) + (height / + u)*width]; } else if ((u >= (height / )) && (v<(width / ))) { center_data[v + u*width] = normalized_data[(width / + v) + (u - height / )*width]; } else if ((u >= (height / )) && (v >= (width / ))) { center_data[v + u*width] = normalized_data[(v - width / ) + (u - height / )*width]; } } } // 向中心化的数组填充空间 int bytesPerLine = (width*+)/*; unsigned char *dst_data = new unsigned char[bytesPerLine*height]; for(int i=;i<height;i++) for(int j=;j<width;j++) { dst_data[i*bytesPerLine+j] = center_data[i*width+j]; } return new MyImage(dst_data,width,height,MyImage::format::GRAY8); }
至此,离散傅里叶变换的方法实现完成,效果图如下:
如果上述教程或代码中有任何错误,欢迎批评和指证。
五、c++实现离散傅里叶变换的更多相关文章
- 离散傅里叶变换(DFT)
目录 一.研究的意义 二.DFT的定义 三.DFT与傅里叶变换和Z变换的关系 四.DFT的周期性 五.matlab实验 五.1 程序 ...
- opencv3.2.0图像离散傅里叶变换
源码: ##名称:离散傅里叶变换 ##平台:QT5.7.1+opencv3.2.0 ##日期:2017年12月13. /**** 新建QT控制台程序****/ #include <QCoreAp ...
- c语言数字图像处理(六):二维离散傅里叶变换
基础知识 复数表示 C = R + jI 极坐标:C = |C|(cosθ + jsinθ) 欧拉公式:C = |C|ejθ 有关更多的时域与复频域的知识可以学习复变函数与积分变换,本篇文章只给出DF ...
- Opencv 实现图像的离散傅里叶变换(DFT)、卷积运算(相关滤波)
我是做Tracking 的,对于速度要求非常高.发现傅里叶变换能够使用. 于是学习之. 核心: 最根本的一点就是将时域内的信号转移到频域里面.这样时域里的卷积能够转换为频域内的乘积! 在分析图像信号的 ...
- opencv 3 core组件进阶(3 离散傅里叶变换;输入输出XML和YAML文件)
离散傅里叶变换 #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" ...
- 用matlab脚本语言写M文件函数时用三种方法简单实现实现DFT(离散傅里叶变换)
%用二重循环实现DFT: function xk=dt_0(xn); %define a function N=length(xn); %caculate the length of the vari ...
- 灰度图像--频域滤波 傅里叶变换之离散傅里叶变换(DFT)
学习DIP第23天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...
- 【转】离散傅里叶变换-DFT(FFT)基础
转:https://blog.csdn.net/zhangxz259/article/details/81627341 什么是离散傅里叶变换 matlab例子 本文是从最基础的知识开始讲解,力求用最通 ...
- OpenCV离散傅里叶变换
离散傅里叶变换 作用:得到图像中几何结构信息 结论:傅里叶变换后的白色部分(即幅度较大的低频部分),表示的是图像中慢变化的特性,或者说是灰度变化缓慢的特性(低频部分). 傅里叶变换后的黑色部分(即幅度 ...
随机推荐
- java中的几种架构对象(PO,VO,DAO,BO,POJO)
java中的几种对象(PO,VO,DAO,BO,POJO) 一.PO :(persistant object ),持久对象 可以看成是与数据库中的表相映射的java对象.使用Hibernate来生 ...
- 17.[CVE-2017-12615]Tomcat任意文件上传漏洞
[CVE-2017-12615] Tomcat任意文件上传漏洞 首先先贴出wooyun上的一个案例:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0 ...
- 29.极具破坏力的DDoS:浅析其攻击及防御
一.DDoS的概念 1.什么是“DDoS”? DDoS:Distributed Denial of Service(分布式拒绝服务)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一 ...
- 《Linux内核设计与实现》读书笔记(二)- 内核开发的准备
在尝试内核开发之前,需要对内核有个整体的了解. 主要内容: 获取内核源码 内核源码的结构 编译内核的方法 内核开发的特点 1. 获取内核源码 内核是开源的,所有获取源码特别方便,参照以下的网址,可以通 ...
- .net Core命令行,Json配置
创建.netCore控制台 NuGet :Microsoft.AspNetCore.All static void Main(string[] args) { var builder = new Co ...
- Boost Python学习笔记(一)
开发环境搭建 下载源码 boost_1_66_0.tar.gz 生成编译工具 # tar axf boost_1_66_0.tar.gz # cd boost_1_66_0 # yum install ...
- Python-OpenCV中的图像模糊
目录 1. 高斯模糊:cv2.GaussianBlur() 主要记录Python-OpenCV中的图像模糊操作: 1. 高斯模糊:cv2.GaussianBlur() def GaussianBl ...
- VMware Workstation 安装以及Linux虚拟机安装 指北
最近有挺多小伙伴跟我说起虚拟机这个东西,所以,今天就给大家写一篇虚拟机安装使用指北吧. 虚拟机(英语:virtual machine),在计算机科学中的体系结构里,是指一种特殊的软件,可以在计算机平台 ...
- 日志记录:MySQL系列之十一
一.SQL命令历史 ~/.mysql_history 记录了在mysql中执行的命令历史 二.事务日志 transaction log:事务型存储引擎自行管理和使用 在一个事务提交后还没有存到磁盘的情 ...
- centos6.5下安装python3.6、pip、ipython
一.先更换系统源 为了下载顺畅一般都会更改为国内源. 1 cd /etc/yum.repos.d/ 2 wget http://mirrors.163.com/.help/CentOS6-Base-1 ...