基础知识

复数表示

C = R + jI

极坐标:C = |C|(cosθ + jsinθ)

欧拉公式:C = |C|e

有关更多的时域与复频域的知识可以学习复变函数与积分变换,本篇文章只给出DFT公式,性质,以及实现方法

二维离散傅里叶变换(DFT)

其中f(x,y)为原图像,F(u,v)为傅里叶变换以后的结果,根据欧拉公式可得,每个F(u,v)值都为复数,由实部和虚部组成

代码示例

 void dft(short** in_array, double** re_array, double** im_array, long height, long width)
{
double re, im, temp; for (int i = ; i < height; i++){
for (int j = ; j < width; j++){
re = ;
im = ; for (int x = ; x < height; x++){
for (int y = ; y < width; y++){
temp = (double)i * x / (double)height +
(double)j * y / (double)width;
re += in_array[x][y] * cos(- * pi * temp);
im += in_array[x][y] * sin(- * pi * temp);
}
} re_array[i][j] = re;
im_array[i][j] = im;
}
}
printf("dft done\n");
}

傅里叶谱

相角

功率谱

傅里叶变换频谱图

对于上面得两幅图案,在区间[0, M-1]中,变换数据由两个在点M/2处碰面的背靠背的半个周期组成

针对显示和滤波的目的,在该区间中有一个完整的变换周期更加方便,因为完整周期中数据是连续的

我们希望得到上图所示的图案

傅里叶变换的平移性质

因此对每个f(x, y)项乘以(-1)x+y可达目的

代码示例

 void fre_spectrum(short **in_array, short **out_array, long height, long width)
{
double re, im, temp;
int move; for (int i = ; i < height; i++){
for (int j = ; j < width; j++){
re = ;
im = ; for (int x = ; x < height; x++){
for (int y = ; y < width; y++){
temp = (double)i * x / (double)height +
(double)j * y / (double)width;
move = (x + y) % == ? : -;
re += in_array[x][y] * cos(- * pi * temp) * move;
im += in_array[x][y] * sin(- * pi * temp) * move;
}
} out_array[i][j] = (short)(sqrt(re*re + im*im) / sqrt(width*height));
if (out_array[i][j] > 0xff)
out_array[i][j] = 0xff;
else if (out_array[i][j] < )
out_array[i][j] = ;
}
}
}

执行结果

旋转性质

即f(x, y)旋转一个角度,F(u, v)旋转相同的角度

二维离散傅里叶反变换

代码示例

 void idft(double** re_array, double** im_array, short** out_array, long height, long width)
{
double real, temp; for (int i = ; i < height; i++){
for (int j = ; j < width; j++){
real = ; for (int x = ; x < height; x++){
for (int y = ; y < width; y++){
temp = (double)i * x / (double)height +
(double)j * y / (double)width; real += re_array[x][y] * cos( * pi * temp) -
im_array[x][y] * sin( * pi * temp);
}
} out_array[i][j] = (short)(real / sqrt(width*height));
if (out_array[i][j] > 0xff)
out_array[i][j] = 0xff;
else if (out_array[i][j] < )
out_array[i][j] = ;
}
}
printf("idft done\n");
}

经验证,图像经傅里叶变换,然后再反变换以后可恢复原图

改进

本篇文章只是按照二维离散傅里叶变换公式进行了实现,在测试的过程中发现,执行速度真的是非常慢,算法时间复杂度O(n4),等以后有时间再对这段代码进行优化。

c语言数字图像处理(六):二维离散傅里叶变换的更多相关文章

  1. c语言数字图像处理(二):图片放大与缩小-双线性内插法

    图像内插 假设一幅大小为500 * 500的图像扩大1.5倍到750 * 750,创建一个750 * 750 的网格,使其与原图像间隔相同,然后缩小至原图大小,在原图中寻找最接近的像素(或周围的像素) ...

  2. 以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组

    学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简 ...

  3. C语言中如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...

  4. 多尺度二维离散小波重构waverec2

    clc,clear all,close all; load woman; [c,s]=wavedec2(X,2,'haar');%进行2尺度二维离散小波分解.分解小波函数haar %多尺度二维离散小波 ...

  5. 单尺度二维离散小波重构(逆变换)idwt2

    clc,clear all,close all; load woman; %单尺度二维离散小波分解.分解小波函数haar [cA,cH,cV,cD]=dwt2(X,'haar'); %单尺度二维离散小 ...

  6. 多尺度二维离散小波分解wavedec2

    对X进行N尺度小波分解 [C,S]=wavedec2(X,N,'wname'); clc,clear all,close all; load woman; [c,s]=wavedec2(X,2,'db ...

  7. 单尺度二维离散小波分解dwt2

    clc,clear all,close all; load woman; [cA,cH,cV,cD]=dwt2(X,'haar');%单尺度二维离散小波分解.分解小波函数haar figure,ims ...

  8. 混沌数学之CircuitChaotic(二维离散电路混沌系统)

    相关软件参见:混沌数学之离散点集图形DEMO 相关代码: // http://wenku.baidu.com/link?url=yg_gE7LUXCg2mXRp-ZZdfRXXIkcNj8YOhvN7 ...

  9. java、python、golang等开发语言如何快速生成二维码?

    免费二维码生成途径非常多!比如比较有名的草料二维码,如果只是简单的使用,用它就足够了.但是如果想大规模的生成,那就不太合适了.再者很多工具都没办法在二维码中加入logo(像微信二维码一样). 接下来, ...

随机推荐

  1. setnx redis

    使用锁 1)setnx(lockkey, 当前时间+过期超时时间) ,如果返回1,则获取锁成功:如果返回0则没有获取到锁,转向2.2.)get(lockkey)获取值oldExpireTime ,并将 ...

  2. ARC与Toll-Free Bridging

    arc模块与mrc模块的沟通. 相当于程序的混编处理. Toll-Free Briding保证了在程序中,可以方便和谐的使用Core Foundation类型的对象和Objective-C类型的对象. ...

  3. Mysql数据库的mysql Schema 究竟有哪些东西& 手工注入的基础要领

    #查看数据库版本号 mysql> select @@version; +------------+ | @@version  | +------------+ | 5.5.16-log | +- ...

  4. Day2 CSS

    什么是CSS 层叠样式表(cascading style sheet) 控制页面元素的显示方式.(添加样式) CSS语法 行间样式 行内式是在标记的style属性中设定CSS样式.这种方式没有体现出C ...

  5. github与git基本操作(一)

    一.git上传本地项目到github 前提:github创建一个空仓库(得到“https://自己的仓库url地址”)1.第一步:就是要进入这个目录下,cmd2.第二步:输入git init3.第三步 ...

  6. vue.js数据绑定

      语法         插值             双大括号:{{text}} {{*text}}之渲染第一次 {{{html}}}        表达式(各种数值,变量,运算符的综合体)     ...

  7. caffe 安装记录

    为了使用caffe,特地装了linux系统,版本:Ubuntu14.04 X64 可参照 http://www.cnblogs.com/platero/p/3993877.html 这个博客写的更好h ...

  8. Linux基础命令之文件过滤及内容编辑处理(一)

    . cat 功能是连接多个文件并且打印到屏幕输出,或重定向到指定的文件 五大功能: 1.查看文件内容 cat file.txt 2.合并文件内容 cat file1 file2>newfile3 ...

  9. Mac开发中遇到的一些小问题解析

    通过mac开发的过程中,有一些小问题出现,列如下,后续会持续增加: 1. 命令行清空废纸篓(jar包太多,倾倒废纸篓太慢) sudo rm -rfv ~/.Trash /Volumes/*/.Tras ...

  10. CodeIgniter Doctrine2基本使用(二)(转)

    CodeIgniter Doctrine2基本使用(二) 继上次写的一篇文章<CodeIgniter Doctrine2基本使用(一)>写到操作实体的之通过Channel这个实体向数据库表 ...