OpenCV(cv::mulSpectrums())



cv::mulSpectrums() 是 OpenCV 中用于频域信号处理的一个函数,它可以将两个频域的傅里叶变换结果相乘。通常用于频域滤波、卷积、相关性计算等任务。



1. 函数定义

void cv::mulSpectrums(InputArray a, InputArray b, OutputArray c, int flags, bool conjB = false);

参数:

  • a (输入参数): 第一个输入的频域图像,通常是傅里叶变换后的结果。
  • b (输入参数): 第二个输入的频域图像,通常是傅里叶变换后的结果。
  • c (输出参数): 输出的频域图像,是输入图像 ab 经过频域乘法后的结果。
  • flags: 用来指定乘法的类型。常见的标志包括:
    • cv::DFT_ROWS: 仅在每一行上执行傅里叶变换,而不是整个二维图像。
    • 0: 在整个频域上进行乘法。
  • conjB: 如果设置为 true,则对 b 的频谱取共轭(conjugate)后再与 a 相乘。该选项通常用于计算互相关性或卷积。


2. 工作原理

  1. 频域相乘cv::mulSpectrums() 在频域内对两个傅里叶变换的结果进行逐点相乘。与时域卷积相对应,频域内的乘法等效于时域内的卷积。

  2. 共轭操作conjB 参数控制是否对 b 的频谱取共轭,这个选项在实现交叉相关(cross-correlation)时很有用。交叉相关是用来检测两个信号之间的相似性。

  3. 卷积和相关性

    • conjB = false 时,执行的是频域乘法,这与时域的卷积等价。
    • conjB = true 时,执行的是频域交叉相关,这与时域的相关性计算等价。


3. 示例

#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    // 读取灰度图像
    Mat img1 = imread("image1.jpg", IMREAD_GRAYSCALE);
    Mat img2 = imread("image2.jpg", IMREAD_GRAYSCALE);
    
    // 将图像转换为频域
    Mat planes1[] = { Mat_<float>(img1), Mat::zeros(img1.size(), CV_32F) };
    Mat planes2[] = { Mat_<float>(img2), Mat::zeros(img2.size(), CV_32F) };
    Mat complexI1, complexI2;
    
    merge(planes1, 2, complexI1);
    merge(planes2, 2, complexI2);
    
    dft(complexI1, complexI1);
    dft(complexI2, complexI2);
    
    // 频域乘法(不取共轭)
    Mat result;
    mulSpectrums(complexI1, complexI2, result, 0, false);
    
    // 逆傅里叶变换回到时域
    idft(result, result, DFT_SCALE | DFT_REAL_OUTPUT);
    
    // 显示结果
    normalize(result, result, 0, 1, NORM_MINMAX);
    imshow("Result", result);
    waitKey();
    
    return 0;
}


4. 典型应用

  • 卷积:时域的卷积可以通过频域乘法来加速,特别是在处理大图像时。
  • 交叉相关性:用于检测两个图像或信号的相似性,通常在模板匹配中使用。
  • 频域滤波:可以在频域内实现滤波操作,如高通、低通、带通滤波器等。


5. 总结

cv::mulSpectrums() 是一个强大的工具,它将复杂频域信号相乘,广泛应用于图像卷积、滤波、交叉相关等任务。通过使用傅里叶变换,频域内的乘法可以显著加速卷积等操作。



posted @   做梦当财神  阅读(270)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2022-08-29 医学图像存储格式
2022-08-29 np.fft
2022-08-29 核磁共振中k-space图的低频和高频
2022-08-29 SE、GRE序列
2022-08-29 磁共振成像原理
点击右上角即可分享
微信分享提示