`

opencv之离散傅里叶变换

 
阅读更多

 

        距离进入实验室已经快1个月了,小编还没有把C++和opencv看完,嗯。。。和我之前计划的不一样,计划赶不上变化,人生无常,摸一把辛酸泪,还要继续努力啊!!!

        离别已久的周六组会又要来了,这次要拿下“离散傅里叶变化”。

 

        书上说,离散傅里叶变化(Discrete Fourier Transform,缩写为DFT),是指傅里叶变换在时域和频域上都呈现离散的形式,将时域信号的采样变换为在离散时域傅里叶变换(DTFT)频域的采样。

        书上说的很抽象,很复杂,小编去搜了搜时域(spatial domain)和频域(frequency domain)。首先,时域和频域是信号的基本性质,这样可以用多种方式来分析信号,每种方式提供了不同的角度。解决问题的最快方式不一定是最明显的方式,用来分析信号的不同角度称为域。时域是真实世界,是惟一实际存在的域。因为我们的经历都是在时域中发展和验证的,已经习惯于事件按时间的先后顺序地发生。频域,尤其在射频和通信系统中运用较多,在高速数字应用中也会遇到频域。频域最重要的性质是:它不是真实的,而是一个数学构造。时域是惟一客观存在的域,而频域是一个遵循特定规则的数学范畴,频域也被一些学者称为上帝视角。

        如下图所示,上面是时域,下面是频域。

        那么,是什么傅里叶变换呢?

        傅里叶变换是一种线性的积分变换。它就是一种变换。对一张图像使用傅里叶变换就是将他分解成正弦和余弦两个部分,也就是将图像从空间域转换到频域。傅里叶变换就是一个用来将函数分解的工具。

        傅里叶变换分为四种:连续傅里叶变换、傅里叶级数、离散时域傅里叶和离散傅里叶。这里就说一下离散傅里叶吧。

        二维图像的傅里叶变换可以用以下数学公式表达。

        式中f是空间域值,F是频域值。好吧,数学公式其实我也看不懂,没关系,不影响理解。

        转换之后的频域值是复数,因此,显示傅里叶变换之后的结果需要用实数图像(real image)加虚数图像(complex image),或者幅度图像(magitude image)加相位图像(phase image)的形式。

        幅度图像:表示振幅的图像。相位图像:相位是对于一个波,特定的时刻在它循环中的位置(一种它是否在波峰、波谷或者他们之间的某点的标度)。

        在实际的图像处理的过程中,仅仅使用了幅度图像,因为幅度图像包含了原图像的几乎所有我们需要的几何信息。然而,如果想要通过修改幅度图像或者相位图像的方法来间接修改原空间图像,需要使用逆傅里叶变换得到修改后的空间图像,这样就必须同时保留幅度图像和相位图像。

 

        如果需要得到图像中的几何结构信息,那就需要傅里叶变换。在频域里面,对于一幅图像,高频部分代表了图像的细节、纹理信息;低频部分代表了图像的轮廓信息。如果对一副精细的图像使用低通滤波器,那么滤波后的结果就只剩下轮廓了。如果图像受到的噪声恰好位于某个特定的“频率”范围内,则可以通过滤波器来恢复原来的图像。

        傅里叶变换在图像处理中可以做到图像增强与图像去噪、图像分割之边缘检测、图像特征提取、图像压缩等。

        傅里叶变换的意义:

        为什么我们要用正弦曲线来代替原来的曲线呢?如果我们如果我们也还可以用方波或三角波来代替,分解信号的方法是无穷的,但分解信号的目的是为了更加简单地处理原来的信号。用正余弦来表示原信号会更加简单,因为正余弦拥有其他信号所不具备的性质:正弦曲线保真度。一个正弦曲线信号输入后,输出的仍是正弦曲线,只有幅度和相位可能发生变化,但是频率和波的形状仍是一样的,且只有正弦曲线才拥有这样的性质,正因如此我们才不用方波或三角波来表示。

        傅立叶变换的物理意义在哪里?

        立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。当然这是从数学的角度去看傅立叶变换。

        那么从物理的角度去看待傅立叶变换,它其实是帮助我们改变传统的时间域分析信号的方法转到从频率域分析问题的思维。

        所以,最前面的时域信号在经过傅立叶变换的分解之后,变为了不同正弦波信号的叠加,我们再去分析这些正弦波的频率,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。

        傅立叶变换提供给我们这种换一个角度看问题的工具,看问题的角度不同了,问题也许就迎刃而解!

//用dft函数计算两个二维实矩阵卷积,参照opencv3编程入门
void convolveDFT(InputArray A, InputArray B, OutputArray C)
//InputArray和OutputArray两个类都是代理数据类型,可以看做一个接口。
//InputArrayMat、Mat_<T>、Mat_<T, m, n>、vector<T>、
//vector<vector<T>>、vector<Mat>。

{
	//[1]初始化输出矩阵
	C.create(abs(A.rows - b.rows) + 1, abs(A.cols - B.cols) + 1, A.type());
	//输出的C调用create函数(行,列,类型)创建矩阵
	//abs()函数求绝对值

	Size dftSize;
	//Size类设置大小

	//[2]计算DFT变换的尺寸
	dftSize.width = getOptimalDFTSize(A.cols + B.cols - 1);
	dftSize.height = getOptimalDFTSize(A.rows + B.rows - 1);
	//getOptimalDFTSize函数返回DFT最优尺寸大小。

	//[3]分配临时缓冲区并初始化置0
	Mat tempA(dftSize, A.type(), Scalar::all(0));
	Mat tempB(dftSize, B.type(), Scalar::all(0));
	//Scalar()对矩阵初始化赋值。它有一个单独的成员val,它是一个指向4个双精度浮点数数组的指针
	//ScalarAll(),一个参数,并且val[]中的4个元素都是这个参数
	//RealScalar(),一个参数,它被传递给val[0],而val[]数组别的值被赋为0
	//Scalar(),需要一个、两个、三个或者四个参数并将这些参数传递给数组val[]中的相应元素

	//[4]分别复制A和B到tempA和tempB的左上角
	Mat roiA(tempA, Rect(0, 0, A.cols, A.cows));
	A.copyTo(roiA);
	Mat roiB(tempB, Rect(0, 0, B.cols, B.cows));
	B.copyTo(roiB);

	//[5]就地操作(in-place),进行快速傅里叶变换,并将nonzeroRows参数设置为非0,以进行更加快速的处理
	dft(tempA, tempA, 0, A.rows);
	dft(tempB, tempB, 0, B.rows);

	//[6]将得到的频谱相乘,结果存放到tempA中
	mulSpectrums(tempA, tempB, tempA);
	//傅里叶频谱的乘法mulApectrums,前两个参数相乘,放到第三个参数中

	//[7]将结果变换为频域,且尽管结果行(result rows)都为非零,我们只需要其中的C.rows的第一行,所以采用nonzeroRows==C.rows
	dft(tempA, tempA, DFT_INVERSE + DFT_SCALE, C.rows);

	//[8]将结果复制到C中
	tempA(Rect(0, 0, C.cols, C.rows).copyTo(C));

	//[9]所有的临时缓冲区将被自动释放,所以无需收尾操作
}

 

  • 大小: 58 KB
  • 大小: 32.2 KB
  • 大小: 173.8 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    opencv-离散傅里叶变换

    离散傅里叶变换(DFT),是傅里叶变换在时域和频域上都呈现离散的形式,将时域信号的采样变换为在离散时间傅里叶变换(DTFT)频域的采样。在形式上,变换两端(时域和频域上)的序列是有限长的,而实际上这两组序列都应当...

    机器视觉-opencv-离散傅里叶变换

    离散傅里叶变换(Discrete Fourier Transform, DFT)是数字信号处理中的核心概念,尤其是在计算机视觉领域,如OpenCV库中有着广泛的应用。OpenCV是一个强大的开源计算机视觉库,它提供了各种图像处理和计算机视觉...

    源(在opencv中离散傅里叶变换图形).cpp

    在opencv中离散傅里叶变换图形

    基于opencv的图像傅里叶变换

    在OpenCV中,`cv::dft()`函数用于执行离散傅里叶变换(DFT),而`cv::idft()`则用于进行逆离散傅里叶变换,将频率域的图像转换回空间域。 1. **离散傅里叶变换(DFT)** DFT是将一幅图像的每个像素值看作时间序列,...

    OpeCV图像离散傅里叶变换.pdf

    "OpenCV图像离散傅里叶变换" 本文主要介绍OpenCV图像处理库中的离散傅里叶变换(Discrete Fourier Transform,DFT)算法的实现。离散傅里叶变换是一种非常重要的信号处理技术,广泛应用于图像处理、信号处理、通信...

    图像离散傅里叶变换,C++实现,可直接运行

    图像离散傅里叶变换,C++实现,可直接运行,调用OpenCV。

    opencv实现傅里叶变换

    在OpenCV中,我们可以使用`cv::dft()`函数来执行离散傅里叶变换(DFT)。这个函数可以对图像进行实数或复数的DFT,返回的结果是包含幅度和相位信息的复数矩阵。 接下来是幅度计算。傅里叶变换后的结果通常需要计算...

    OpenCV实现离散傅里叶变换(C++实现).zip

    C++ OpenCV驱动程序,OpenCV beta工程环境。 项目代码可直接编译运行~

    离散余弦变换DCT代码C++

    离散余弦变换(DCT for Discrete Cosine Transform)是与傅里叶变换相关的一种变换,它类似于离散傅里叶变换(DFT for Discrete Fourier Transform),但是只使用实数。离散余弦变换相当于一个长度大概是它两倍的离散...

    [opencv] 015 离散傅里叶变换DFT

    离散傅里叶变换(Discrete Fourier Transform, DFT)是数字信号处理中的核心概念,特别是在计算机视觉领域,如OpenCV库中广泛应用。OpenCV是一个跨平台的计算机视觉库,它提供了丰富的函数来处理图像,其中包括对...

    C++OpenCV3源代码离散傅里叶变换

    根据提供的文件信息,本文将详细解析“C++ OpenCV3 源代码离散傅里叶变换”的相关知识点。这不仅包括对离散傅里叶变换(Discrete Fourier Transform, DFT)的基本概念介绍,还会深入探讨如何在C++环境下利用OpenCV库...

    opencv实现图像傅里叶变换

    OpenCV中的`dft`(离散傅里叶变换)函数是实现这一转换的关键。在使用`dft`之前,我们需要对图像进行预处理,以确保其尺寸为2的幂,这是因为快速傅里叶变换(FFT)在处理这种尺寸的图像时效率最高。可以使用`...

    【OpenCv基础】第六十四讲 离散傅里叶变换.zip

    离散傅里叶变换(Discrete Fourier Transform, DFT)是数字信号处理中的一个重要概念,尤其是在计算机视觉领域,如OpenCV库中有着广泛的应用。OpenCV是一个强大的开源计算机视觉库,支持多种编程语言,包括C#、...

    基于OpenCv的傅里叶变换和低通滤波

    在OpenCV中,可以使用`dft()`函数对图像进行离散傅里叶变换(DFT)。 低通滤波器则是一种允许低频信号通过而衰减高频信号的滤波器。在图像处理中,低频成分通常对应于图像的整体亮度和色调,而高频成分则包含更多的...

    离散 傅里叶变换

    OpenCV库提供了`dft()`函数,用于执行离散傅里叶变换。该函数可以处理单通道(灰度)或双通道(彩色)图像。调用格式如下: ```cpp void cv::dft(InputArray src, OutputArray dst, int flags=0, Size zero_pad_...

    c++实现图像傅里叶变换、离散余弦变换和沃尔什变换

    在图像处理领域,傅里叶变换、离散余弦变换(DCT)和沃尔什变换是三种重要的数学工具,它们用于分析图像的频率成分。在C++编程环境下,实现这些变换可以帮助我们理解图像的本质特性,并在图像压缩、滤波、增强等方面...

    DCT(离散余弦)和DFT(离散傅里叶)变换opencv

    离散余弦变换(DCT)与离散傅里叶变换(DFT)是数字信号处理和图像处理领域中的两种核心变换技术。在OpenCV库中,这两种变换被广泛用于图像分析、压缩和滤波等任务。让我们深入探讨这两种变换及其在OpenCV中的应用。...

    OpenCV-C++ 傅里叶变换检测缺陷

    在OpenCV中,`dft`(离散傅里叶变换)函数是实现傅里叶变换的关键。它接受一个二维数组(图像)作为输入,返回其对应的复数频谱。为了得到实际的幅度谱,我们需要对结果进行复共轭并取平方,然后除以图像尺寸,这个...

    图像傅里叶变换(C++)

    OpenCV提供了`dft`函数,可以直接对图像进行离散傅里叶变换。以下是一个简化的代码示例: ```cpp #include &lt;opencv2/opencv.hpp&gt; cv::Mat dftImage(const cv::Mat& img) { // 将灰度图像转换为复数类型 cv::Mat ...

    离散傅里叶变换

    在OpenCV中,`dft()`函数用于执行离散傅里叶变换。这个函数接受一个复数或实数矩阵作为输入,并返回一个复数结果。在处理图像时,通常先将图像转换为浮点型,然后归一化到合适的范围内。为了得到可读的频谱图,通常...

Global site tag (gtag.js) - Google Analytics