opencv去除图像正弦噪声的c++代码
时间: 2023-11-04 09:16:01 浏览: 105
以下是使用opencv去除图像正弦噪声的C++代码的示例:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("image.jpg", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "Could not read the image" << endl;
return -1;
}
Mat img_dft;
img.convertTo(img_dft, CV_32F);
img_dft /= 255.0;
dft(img_dft, img_dft, DFT_COMPLEX_OUTPUT);
Mat mag(img_dft.size(), CV_32F);
Mat phase(img_dft.size(), CV_32F);
split(img_dft, vector<Mat>{ mag, phase });
for (int i = 0; i < mag.rows; i++)
{
for (int j = 0; j < mag.cols; j++)
{
float mag_val = mag.at<float>(i, j);
float phase_val = phase.at<float>(i, j);
if (mag_val > 0.1)
{
mag.at<float>(i, j) = mag_val * (1 - 0.9 * exp(-0.5 * pow(phase_val - M_PI, 2.0) / pow(M_PI / 2.0, 2.0)));
}
else
{
mag.at<float>(i, j) = 0;
}
}
}
Mat img_dft_filtered;
merge(vector<Mat>{ mag, phase }, img_dft_filtered);
dft(img_dft_filtered, img_dft_filtered, DFT_INVERSE | DFT_SCALE);
Mat img_filtered;
img_dft_filtered.convertTo(img_filtered, CV_8U);
imshow("Original Image", img);
imshow("Filtered Image", img_filtered);
waitKey();
return 0;
}
```
该代码使用离散傅里叶变换(DFT)来处理图像,并通过减少幅度中的噪声来去除正弦噪声。在这个例子中,我们使用了一个高斯函数来过滤相位谱中的噪声。最终,我们将过滤后的图像反向傅里叶变换回空间域。
阅读全文