opencv学习笔记——傅里叶变换
幅度谱(Magnitude Spectrum):傅里叶变换的幅度谱表示了图像中不同频率成分的强度。幅度谱中的每个点对应于一个特定的频率,其值表示该频率成分的强度。幅度谱通常是对称的,因为实数图像的傅里叶变换是共轭对称的。此时,傅里叶级数中的离散频率成分变为连续的频率成分,傅里叶级数变为傅里叶变换。频率分布:在幅度谱中,低频成分通常位于图像的中心,而高频成分则位于图像的边缘。它代表图像的平均亮度。傅
一、数学原理
基础数学概念:任何复杂的信号或函数都可以表示为不同频率的正弦波和余弦波的线性组合。
傅里叶变换将信号从时域(空间域)转换到频域,分解为不同频率的正弦波和余弦波,从而在频率中分析信号的频率成分
1、傅里叶级数
对于一个周期函数f(t), 其周期为T,傅里叶级数表示为
2、傅里叶变换
对于非周期函数,可以将其视为周期趋于无穷大的周期函数。此时,傅里叶级数中的离散频率成分变为连续的频率成分,傅里叶级数变为傅里叶变换。傅里叶变换的定义为:
3、傅里叶逆变换
将频域函数F(w)转换回时域函数f(t)的过程,定义为:
4、傅里叶变换的性质
1)线性:傅里叶变换是线性操作
2)时移:时域中的平移对应于频域中的相位变化
3)频移:频域中的平移对应于时域中的相位变化
4)卷积:时域中的卷积对应于频域中的乘积
5)乘积:时域中的乘积对应于频域中的卷积
二、实现方法(OpenCV、C++)
1、将图像扩展到最佳尺寸。傅里叶变换的性能与图像大小有关,最佳大小是2、3、5的倍数。可以使用cv::getOptimalDFTSize()函数获取最佳尺寸,并通过cv::copyMakeBorder()扩展图像边界:
Mat padded; //expand input image to optimal size
int m = getOptimalDFTSize( I.rows );
int n = getOptimalDFTSize( I.cols ); // on the border add zero pixels
copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0));
2、创建复数矩阵,傅里叶变换的结果是复数,需要为实部、虚部分配空间。
傅里叶变换的频域范围非常大,数据类型至少要用float:
Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
Mat complexI;
merge(planes, 2, complexI); // Add to the expanded another plane with zeros
3、计算傅里叶变换
dft(complexI, complexI); // this way the result may fit in the source matrix
4、计算幅度谱
split(complexI, planes); // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))
magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude
Mat magI = planes[0];
5、对数变换
因数据范围较大,通过对数计算缩小数据范围
magI += Scalar::all(1); // switch to logarithmic scale
log(magI, magI);
6、调整零频分量到图像中心,将幅度图与原图进行关系对应
magI = magI(Rect(0, 0, magI.cols & -2, magI.rows & -2)); //在傅里叶变换中,magI.cols & -2 和 magI.rows & -2 用于确保图像的宽度和高度是偶数。这是因为傅里叶变换的结果需要进行频谱中心化,而中心化操作要求图像的尺寸是偶数。通过这种方式,可以避免因尺寸问题导致的边界错误。
int cx = magI.cols/2;
int cy = magI.rows/2;
Mat q0(magI, Rect(0, 0, cx, cy)); // Top-Left - Create a ROI per quadrant
Mat q1(magI, Rect(cx, 0, cx, cy)); // Top-Right
Mat q2(magI, Rect(0, cy, cx, cy)); // Bottom-Left
Mat q3(magI, Rect(cx, cy, cx, cy)); // Bottom-Right
Mat tmp; // swap quadrants (Top-Left with Bottom-Right)
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
q1.copyTo(tmp); // swap quadrant (Top-Right with Bottom-Left)
q2.copyTo(q1);
tmp.copyTo(q2);
7、归一化,为方便显示
normalize(magI, magI, 0, 1, NORM_MINMAX); // Transform the matrix with float values into a
// viewable image form (float between values 0 and 1).
8、傅里叶逆变换
idft(complexI, complexI); // 逆变换
split(complexI, planes); // 分离实部和虚部
normalize(planes[0], planes[0], 0, 1, NORM_MINMAX); // 归一化
imshow("Reconstructed Image", planes[0]);
waitKey();
三、结果分析
傅里叶变换结果图中的信息可以理解如下:
幅度谱(Magnitude Spectrum):傅里叶变换的幅度谱表示了图像中不同频率成分的强度。幅度谱中的每个点对应于一个特定的频率,其值表示该频率成分的强度。幅度谱通常是对称的,因为实数图像的傅里叶变换是共轭对称的。
频率分布:在幅度谱中,低频成分通常位于图像的中心,而高频成分则位于图像的边缘。低频成分代表图像中的平滑区域和整体结构,而高频成分代表图像中的细节和边缘。
零频分量:幅度谱的中心点(0,0)表示零频分量,也称为直流分量。它代表图像的平均亮度。在将零频分量移到中心的幅度谱中,零频分量位于图像的中心。
方向信息:幅度谱中的条纹或模式可以提供图像中边缘和纹理的方向信息。例如,如果图像中有一组平行的边缘,那么在幅度谱中将出现一组平行的条纹。
滤波和图像处理:通过在频域中对幅度谱进行操作,可以实现各种图像处理效果。例如,可以通过去除高频成分来平滑图像,或者通过去除低频成分来增强图像的细节。
相位信息:除了幅度谱之外,傅里叶变换还提供了相位信息。相位信息对于图像的重建和某些类型的图像处理非常重要,但通常在显示幅度谱时不会直接显示相位信息。
四、应用场景
- 图像的平滑与锐化
低频成分:幅度谱中的低频成分主要与图像的平滑区域和整体结构相关。低频成分的强度越高,图像的整体亮度和对比度越均匀。
高频成分:高频成分与图像的细节、边缘和纹理相关。高频成分的强度越高,图像的细节越丰富,边缘越清晰。
影响:如果幅度谱中高频成分较少,图像会显得模糊和平滑;如果高频成分较多,图像会显得锐利和清晰。 - 噪声与信号
噪声:图像中的噪声通常表现为高频成分。在幅度谱中,噪声可能表现为随机分布的高频点。
信号:图像中的有用信息(如边缘、纹理)也包含在高频成分中,但通常具有一定的结构和规律。
影响:如果幅度谱中高频成分过多且分布杂乱,可能是噪声较多,导致图像质量下降。通过在频域中去除这些高频噪声成分,可以改善图像质量。 - 对比度
对比度与频率分布:图像的对比度与幅度谱中不同频率成分的分布有关。如果幅度谱中低频成分和高频成分的强度差异较大,图像的对比度会更明显。
影响:如果幅度谱中低频成分过强,图像可能会显得过亮或过暗,对比度较低;如果高频成分过强,图像可能会显得过于锐利,甚至出现过度增强的边缘。 - 图像的结构与纹理
结构信息:幅度谱中的低频成分反映了图像的整体结构,如大尺度的形状和区域。
纹理信息:高频成分则反映了图像的纹理细节,如细小的线条、斑点等。
影响:通过增强或抑制幅度谱中的某些频率成分,可以调整图像的结构和纹理。例如,增强高频成分可以突出纹理,抑制高频成分可以平滑纹理。 - 图像的清晰度
清晰度与高频成分:图像的清晰度主要与高频成分的强度和分布有关。高频成分越丰富,图像的细节越清晰。
影响:如果幅度谱中高频成分较弱,图像可能会显得模糊;如果高频成分较强,图像会显得更清晰。通过增强高频成分,可以提高图像的清晰度。 - 图像的重建质量
完整信息:虽然幅度谱提供了频率成分的强度信息,但完整的傅里叶变换还包括相位信息。相位信息对于图像的重建至关重要。
影响:如果只保留幅度谱信息而忽略相位信息,重建的图像可能会失去原有的结构和细节。因此,幅度谱虽然重要,但不能完全代表图像的所有信息。 - 滤波操作
低通滤波:通过在幅度谱中抑制高频成分,保留低频成分,可以实现图像的平滑和去噪。
高通滤波:通过增强高频成分,抑制低频成分,可以实现图像的锐化和边缘增强。
带通滤波:通过保留特定频率范围的成分,可以提取图像中的特定结构或纹理。
总结
幅度谱通过反映图像中不同频率成分的分布和强度,直接影响图像的质量。通过分析幅度谱,可以:
判断图像的清晰度、对比度和噪声水平。
通过滤波操作调整图像的平滑度、锐化程度和噪声水平。
提取图像的结构和纹理信息。
然而,幅度谱只是傅里叶变换的一部分,完整的图像重建还需要考虑相位信息
五、傅里叶变换应用广泛的原因
傅里叶变换在信号处理、图像处理、通信、物理学、工程学等众多领域应用广泛,主要原因是它提供了一种强大的工具,能够将信号从时域(或空间域)转换到频域,从而揭示信号的频率成分和结构。这种转换使得许多复杂的信号处理任务变得更加直观和易于实现。以下是傅里叶变换在这些领域广泛应用的几个关键原因: - 频率分析
傅里叶变换能够将信号分解为不同频率的正弦波和余弦波的组合,从而揭示信号的频率成分。在频域中,信号的特性(如频率分布、带宽、谐波等)变得一目了然。
应用实例:
在音频处理中,傅里叶变换可以分析音频信号的频谱,帮助识别音调、滤除噪声或进行音效处理。
在通信中,傅里叶变换用于分析信号的频谱,以便设计滤波器和调制解调器。 - 滤波操作
在频域中,滤波操作变得非常直观。通过设计滤波器(如低通滤波器、高通滤波器、带通滤波器等),可以直接对信号的频率成分进行增强或抑制。
应用实例:
图像处理:通过在频域中去除高频噪声成分,可以实现图像的平滑和去噪;通过增强高频成分,可以实现图像的锐化。
信号处理:在音频信号中去除高频噪声,或在通信信号中去除带外干扰。 - 卷积与相关性分析
傅里叶变换的一个重要性质是时域中的卷积对应于频域中的乘积。这一性质使得卷积操作在频域中变得非常高效,因为乘法比卷积的计算复杂度更低。
应用实例:
图像处理:通过在频域中进行卷积操作,可以快速实现图像的滤波、边缘检测等。
信号处理:在通信系统中,信号的调制和解调可以通过频域操作实现。 - 信号压缩与编码
傅里叶变换可以揭示信号中重要的频率成分,从而为信号压缩和编码提供基础。通过保留主要的频率成分并丢弃次要的成分,可以实现信号的有效压缩。
应用实例:
JPEG图像压缩:通过离散余弦变换(DCT,一种傅里叶变换的变体)对图像进行压缩。
音频压缩:如MP3编码,利用傅里叶变换分析音频信号的频谱,去除人耳难以感知的频率成分。 - 系统分析与设计
傅里叶变换可以用于分析线性时不变(LTI)系统的频率响应。通过研究系统的频域特性,可以设计出满足特定要求的滤波器和控制器。
应用实例:
通信系统:设计滤波器以满足特定的频带要求。
控制系统:分析系统的稳定性,设计控制器以优化系统性能。 - 快速傅里叶变换(FFT)
快速傅里叶变换(FFT)是一种高效的算法,能够在 O(NlogN) 的时间复杂度内计算傅里叶变换,这使得傅里叶变换在实际应用中变得可行。
应用实例:
在实时信号处理中,FFT使得快速频谱分析成为可能。
在图像处理中,FFT可以快速实现图像的频域操作。 - 相位信息的重要性
傅里叶变换不仅提供了幅度信息,还提供了相位信息。相位信息对于信号的重建和某些类型的信号处理至关重要。
应用实例:
在图像重建中,相位信息比幅度信息更重要,因为相位决定了信号的结构。
在通信中,相位调制(PSK)是一种重要的调制方式。 - 多领域通用性
傅里叶变换的原理和性质在多个领域具有通用性,无论是在信号处理、图像处理、通信还是物理学中,傅里叶变换都提供了统一的分析框架。
应用实例:
在物理学中,傅里叶变换用于分析波动现象(如声波、光波)。
在工程学中,傅里叶变换用于设计和分析各种系统。
总结
傅里叶变换之所以在信号处理等领域应用广泛,是因为它能够将信号从时域转换到频域,从而揭示信号的频率成分和结构。这种转换使得许多复杂的信号处理任务(如滤波、卷积、压缩、系统分析等)变得更加直观和高效。此外,快速傅里叶变换(FFT)的出现使得傅里叶变换在实际应用中变得可行,进一步推动了其广泛应用。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)