opencv c++通过傅里叶变换去除正弦噪声
时间: 2023-09-11 15:07:27 浏览: 116
以下是使用OpenCV C进行傅里叶变换去除正弦噪声的示例代码:
```c
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat img = imread("sinusoidal_noise.jpg", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "Could not read the image: " << argv[1] << endl;
return 1;
}
// Apply Fourier Transform
Mat imgFreq;
dft(img, imgFreq, DFT_COMPLEX_OUTPUT);
// Shift the zero frequency component to the center of the spectrum
Mat shifted;
fftShift(imgFreq, shifted);
// Create mask to remove sinusoidal noise
Mat mask(img.size(), CV_8UC1, Scalar(0));
int cx = mask.cols / 2;
int cy = mask.rows / 2;
int radius = 30;
circle(mask, Point(cx, cy), radius, Scalar(255), -1);
// Apply mask to the spectrum
Mat filtered;
shifted.copyTo(filtered, mask);
// Shift back the zero frequency component to the top-left corner
Mat shiftedBack;
fftShift(filtered, shiftedBack, true);
// Apply Inverse Fourier Transform
Mat imgFiltered;
idft(shiftedBack, imgFiltered, DFT_SCALE | DFT_REAL_OUTPUT);
// Display the original and filtered images
namedWindow("Original Image", WINDOW_NORMAL);
namedWindow("Filtered Image", WINDOW_NORMAL);
imshow("Original Image", img);
imshow("Filtered Image", imgFiltered);
waitKey(0);
return 0;
}
```
首先,我们读取包含正弦噪声的灰度图像。然后,我们应用傅里叶变换来将图像转换到频域。为了更好地可视化频谱,我们将零频率分量移动到频谱的中心。接下来,我们创建一个掩码来删除正弦噪声。在本例中,我们使用圆形掩码,其半径等于正弦波的频率。然后,我们将掩码应用于频谱,并将零频率分量移回频谱的左上角。最后,我们应用逆傅里叶变换以将图像转换回空域,并显示原始图像和过滤后的图像。
注意:在将频率分量移动到中心和左上角时,我们使用了OpenCV的fftShift()函数。这是因为在DFT之后,频谱的低频分量位于频谱的四个角落中。fftShift()函数将低频分量移到频谱的中心或左上角,以便更好地可视化和处理。
阅读全文