以下是基于C++和OpenCV进行图像二维傅里叶变换的代码:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

using namespace std;
using namespace cv;

int main()
{
    Mat image = imread("lena.jpg", IMREAD_GRAYSCALE);
    if (image.empty())
    {
        cout << "Could not open or find the image" << endl;
        return -1;
    }

    Mat padded; //用于傅里叶变换的填充图像
    int m = getOptimalDFTSize(image.rows); //计算最佳DFT尺寸
    int n = getOptimalDFTSize(image.cols);
    copyMakeBorder(image, padded, 0, m - image.rows, 0, n - image.cols, BORDER_CONSTANT, Scalar::all(0));

    Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) }; //用于存储实部和虚部
    Mat complexImg;
    merge(planes, 2, complexImg); //合并实部和虚部

    dft(complexImg, complexImg); //进行傅里叶变换

    //将频谱图像平移,使得低频分量在图像中间
    shift(planes[0], planes[0], Point(planes[0].cols / 2, planes[0].rows / 2));
    shift(planes[1], planes[1], Point(planes[1].cols / 2, planes[1].rows / 2));

    //计算幅度谱和相位谱
    Mat mag, phase;
    cartToPolar(planes[0], planes[1], mag, phase);

    //显示原始图像、幅度谱和相位谱
    namedWindow("Original Image", WINDOW_NORMAL);
    imshow("Original Image", image);
    namedWindow("Magnitude Spectrum", WINDOW_NORMAL);
    imshow("Magnitude Spectrum", mag);
    namedWindow("Phase Spectrum", WINDOW_NORMAL);
    imshow("Phase Spectrum", phase);

    waitKey(0);
    return 0;
}

在这个代码中,我们首先读取一张灰度图像,然后通过getOptimalDFTSize()函数计算最佳DFT尺寸,并用copyMakeBorder()函数将图像填充到这个尺寸。接着,我们创建一个Mat数组planes,用于存储实部和虚部。我们将原始图像复制到planes[0]中,并将planes[1]初始化为全零。然后,我们将planes数组合并为一个复合图像complexImg,并使用dft()函数进行傅里叶变换。接下来,我们将频谱图像平移,使得低频分量在图像中间,然后使用cartToPolar()函数计算幅度谱和相位谱。最后,我们显示原始图像、幅度谱和相位谱,然后等待用户按下任意按键。

注意,这个代码只展示了如何进行傅里叶变换和计算幅度谱和相位谱,而没有展示如何进行滤波或逆变换。如果你需要进行滤波或逆变换,请参考其他教程或文档。

我需要一段基于c++de opencv进行图像二维傅里叶变换的代码

原文地址: https://www.cveoy.top/t/topic/bstD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录