OpenCV的快速傅里叶变换函数,c++
时间: 2024-06-18 15:03:52 浏览: 13
OpenCV中的快速傅里叶变换函数是dft(),它可以对一个N维数组进行离散傅里叶变换(DFT)。在实际应用中,通常使用二维或三维数组。该函数有很多参数,最常用的是输入数组,输出数组,变换标志和可选掩码。
以下是dft()函数的语法:
```cpp
void cv::dft(
cv::InputArray src,
cv::OutputArray dst,
int flags=0,
int nonzeroRows=0
);
```
其中:
- `src`:输入数组,可以是一个或多个通道的数组。
- `dst`:输出数组,与输入数组具有相同的尺寸和类型。
- `flags`:变换标志,用于控制变换的类型和行为。可以是DFT_COMPLEX_OUTPUT,DFT_INVERSE等。
- `nonzeroRows`:只有当输入数组的行数比输出数组的行数小时才需要指定这个参数。它指定了计算DFT的非零行数。
以下是一个示例代码,它演示了如何使用dft()函数进行二维离散傅里叶变换:
```cpp
cv::Mat img = cv::imread("test.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat planes[] = {cv::Mat_<float>(img), cv::Mat::zeros(img.size(), CV_32F)};
cv::Mat complexImg;
cv::merge(planes, 2, complexImg);
cv::dft(complexImg, complexImg);
// compute magnitude and switch to logarithmic scale
// => log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2))
cv::split(complexImg, planes); // planes = Re(DFT(I), planes = Im(DFT(I))
cv::magnitude(planes, planes, planes); // planes = magnitude
cv::Mat mag = planes;
mag += cv::Scalar::all(1); // switch to logarithmic scale
cv::log(mag, mag);
// rearrange the quadrants of Fourier image
// so that the origin is at the image center
int cx = mag.cols/2;
int cy = mag.rows/2;
cv::Mat q0(mag, cv::Rect(0, 0, cx, cy)); // Top-Left - Create a ROI per quadrant
cv::Mat q1(mag, cv::Rect(cx, 0, cx, cy)); // Top-Right
cv::Mat q2(mag, cv::Rect(0, cy, cx, cy)); // Bottom-Left
cv::Mat q3(mag, cv::Rect(cx, cy, cx, cy)); // Bottom-Right
cv::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);
// normalize and display the result
cv::normalize(mag, mag, 0, 1, cv::NORM_MINMAX);
cv::imshow("Input Image", img);
cv::imshow("spectrum magnitude", mag);
cv::waitKey();
```