今天闲着无聊,做了一下DFT变换。

原理在《数字图像处理(第3版)》P125

在opencv中处理过程为:

以灰度图像的方式读入一张图片

将灰度图片由 CV_8UC1 变换成 CV_32FC1 ,并且对图片进行填充

构建图片的复数形式 (包括添加I部分全零)

调用DFT进行变换

计算欧拉距离,作为|C| 部分

log 变换 (log(1+|C|))

裁剪掉填充部分

调整频率部分,使得得到像书中那样的频谱,否则亮的部分在四个角落

展示图片

我的实验效果:

#include

#include

using namespace std;

using namespace cv;

/*

* Preprocessing and DFT

* cyssmile

* 2020/03/24

*/

void takeDFT(Mat& source, Mat& destination);

/*

* show DFT

* cyssmile

* 2020/03/24

*/

void showDFT(Mat& source);

/*

* Quadrant change to make High frequency part in the middle

* cyssmile

* 2020/03/24

*/

void changeQuadrant(Mat& source);

/*

* invertDFT

* cyssmile

* 2020/03/24

*/

int main(int argc, char** argv)

{

Mat original = imread("D:/images/needDeal.jpg", IMREAD_GRAYSCALE);

if (original.empty())

{

cout << "can`t open this ph" << endl;

}

namedWindow("input", WINDOW_FREERATIO);

imshow("input", original);

Mat destination;

takeDFT(original, destination);

showDFT(destination);

waitKey(0);

destroyAllWindows();

return 0;

}

void takeDFT(Mat& source, Mat& destination)

{

int h = getOptimalDFTSize(source.rows);

int w = getOptimalDFTSize(source.cols);

copyMakeBorder(source, source, 0, h - source.rows, 0, w - source.cols, BORDER_DEFAULT);

//copyMakeBorder(original, original, 0, h - original.rows, 0, w - original.cols, BORDER_CONSTANT, Scalar::all(0));

// CV_8UC1 to CV_32FC1

Mat originalFloat;

//original.convertTo(originalFloat,CV_32FC1,1.0/255.0);

source.convertTo(originalFloat, CV_32FC1, 1.0 / 255.0);

// ready dft data complex;

Mat originalComplex[2] = { originalFloat,Mat::zeros(originalFloat.size(),CV_32F) };

Mat dftOriginal;

merge(originalComplex, 2, dftOriginal);

dft(dftOriginal, destination, DFT_COMPLEX_OUTPUT);

// spectrum Tailoring to Even

//destination = destination(Rect(0, 0, dftOriginal.rows & -2, dftOriginal.cols & -2));

}

void showDFT(Mat& source)

{

Mat sourceComplex[2];

split(source, sourceComplex);

Mat logReady;

magnitude(sourceComplex[0], sourceComplex[1], logReady);

logReady += Scalar::all(1);

log(logReady, logReady);

changeQuadrant(logReady);

normalize(logReady, logReady, 0, 1, NORM_MINMAX);

namedWindow("spectrum", WINDOW_FREERATIO);

imshow("spectrum", logReady);

}

void changeQuadrant(Mat& source)

{

//draw spectrum

int cx = source.cols / 2;

int cy = source.rows / 2;

Mat q0(source, Rect(0, 0, cx, cy));

Mat q1(source, Rect(cx, 0, cx, cy));

Mat q2(source, Rect(0, cy, cx, cy));

Mat q3(source, Rect(cx, cy, cx, cy));

Mat tmp;

q0.copyTo(tmp);

q3.copyTo(q0);

tmp.copyTo(q3);

q1.copyTo(tmp);

q2.copyTo(q1);

tmp.copyTo(q2);

}

之前在计算幅度值的时候,参数调用错了

之前错误的是

magnitude(originalComplex[0], originalComplex[0], originalComplex[1]);

正确的应该是 (R,I dst)

magnitude(originalComplex[0], originalComplex[1], originalComplex[0]);

错误示范

首先由这个频谱我们看出,这有点像椒盐噪声,不连续。而通过傅里叶变换的频谱应该是比较光滑的。

其次 我们绘制频谱值采用log(1+|C|), 那么就与幅值有关。

果然我在观察幅值的计算函数时,发现参数顺序不对。

dft变换的两幅图_图片DFT变换相关推荐

  1. dft变换的两幅图_离散傅立叶变换DTFT、DFT和FFT在工程与数学结合的通俗理解

    1.离散时间傅里叶变换DTFT 何为DTFT?就是对连续时间非周期信号进行抽样(乘积),得到的离散时间非周期信号再求傅里叶变换的过程就是DTFT.其实等同于信号频谱与脉冲信号频谱的卷积,这样得到的就是 ...

  2. dft变换的两幅图_快速傅里叶变换FFT计算方法 原理及公式

    在实际的控制系统中能够得到的是连续信号x(t)的离散采样值x(nT).因此需要利用离散信号x(nT)来计算信号x(t)的频谱. 有限长离散信号x(n),n=0,1,-,N-1的DFT定义为: DFT ...

  3. maltab-图像拼接(左右两幅图)

    maltab-图像拼接(左右两幅图) 图像拼接 参考自 https://blog.csdn.net/m0_37565736/article/details/79865990 并修改了其中错误的地方,添 ...

  4. Tecplot将两幅图叠加显示,一幅contour线图,一幅contour色彩图

    正常情况下,我们是在一个workspace下,对一个frame进行操作的,而两幅图,可以视为是两个frame. 1,调节好第一幅图之后,选择上菜单"Frame"-"Sav ...

  5. 如何比较两幅图的相似度

    比较两幅图的相似度可以使用多种方法,以下是其中几种常用的方法: 1. 均方误差(MSE):将两幅图像的像素值逐个进行比较,计算均方误差.均方误差越小,表示两幅图像越相似. 以下是使用 OpenCV 在 ...

  6. Origin——绘制两幅图一起显示,并切换排版方式

    文章目录 1.导入数据 2.垂直绘制两幅图 3.将垂直放置的两幅图变为水平放置 <======================================================== ...

  7. matlab中如何区分两幅图的亮度_高中历史教学中利用老地图设计习题的尝试

    相较历史地图侧重"时空观念"的特点,老地图的优势在于"史料实证"与"历史解释".笔者利用两幅同一时期且呈现同一地区却由不同国家绘制出版的老地 ...

  8. matlab两幅图重叠,matlab两幅图叠在一起

    MATLAB中内建有cpselect函数,该函数允 许用户在将要拼接的两幅图像的重叠区域 中手工选取一定数量的匹配特征点对然后 自动给出两幅图像之间的初始变换矩阵. 优化...... MATLAB 数 ...

  9. latex的图的排列方法_latex两幅图上下排列

    MCM&ICM集训辅导专题二:Latex排版 11)\\\\ : 无条件结束当前行的排版,将文稿后面的内容从下一 行顶格起排; 12)\\par :分段控制符;也可以有连续两个回车键实现... ...

最新文章

  1. eyoucms range 范围判断标签
  2. vue项目通过命令行传参实现多环境配置(基于@vue/cli)
  3. jvm的参数含义及设置
  4. 静态局部变量和全局变量的区别!
  5. 【干货】周鸿祎谈雷军:能不能All In是一个核武器
  6. 大作文_p2_v1.0
  7. iOS高级-RunLooper
  8. 深度学习在处理视频上几种主要技术方法
  9. 激活策略 查询_5个提问,详细介绍北极星指标的策略框架
  10. Qt文档阅读笔记-Multiple Inheritance Example 实例解析及Automatic Connections解析
  11. mysql xplugin_MySQL 5.7.12版本发布,更重要的是X Plugin也来了
  12. 女生学Java软件开发好就业吗
  13. 遗传算法(一) 遗传算法的基本原理
  14. 软件运维工程师岗位职责和要求
  15. 《符文冲突》unity塔防类游戏试做,经验源码分享-1
  16. 不开心就玩消消乐~~~正则表达式(1)
  17. Linux页表查询--页表项、页面、页内偏移量
  18. Ubuntu-的前世今生
  19. BERT cased和uncased的区别
  20. 任天堂正式发布 NINTENDO SWITCH OLED,乐得瑞任天堂Switch底座方案

热门文章

  1. order by Sql server
  2. 西安面试第一天面试问题总结
  3. 系统跟服务器的区别,域名服务器与根服务器区别
  4. 【电脑小技巧每日一讲:SQL server 2016日志文件的清理】
  5. Service层在分层中的作用
  6. _snprintf_s与_snprintf
  7. Dom4J+XPath
  8. mac 触控板手势以及常用快捷键
  9. 微信小程序如何调用腾讯地图进行定位的简单方法
  10. 电信iptv信号接入服务器,IPTV发展需国家明确电信与广电交叉进入政策