opencv去除图像的正弦噪声,c++代码
时间: 2023-11-04 17:10:53 浏览: 108
以下是使用opencv去除图像正弦噪声的c代码示例:
```c
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("noisy_image.jpg", IMREAD_GRAYSCALE); // 读入带有正弦噪声的灰度图像
Mat smoothed;
GaussianBlur(img, smoothed, Size(5, 5), 0); // 高斯平滑去除噪声
Mat filtered;
medianBlur(smoothed, filtered, 5); // 中值滤波进一步去除噪声
imshow("Original Image", img);
imshow("Filtered Image", filtered);
waitKey(0);
return 0;
}
```
在这个示例中,我们使用了opencv中的高斯平滑和中值滤波函数来去除图像的正弦噪声。首先,我们读入带有噪声的灰度图像,然后使用高斯平滑函数对图像进行平滑处理。接着,我们再使用中值滤波函数进一步去除噪声。最后,我们将原始图像和处理后的图像显示在屏幕上。
相关问题
opencv通过傅里叶变换去除图像正弦噪声的c++代码
以下是使用OpenCV进行傅里叶变换去除图像正弦噪声的C ++代码示例:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("lena.jpg", IMREAD_GRAYSCALE); // 读取灰度图像
if (img.empty())
{
cout << "Failed to load image" << endl;
return -1;
}
// 添加正弦噪声
int amplitude = 50;
float frequency = 0.1;
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
img.at<uchar>(i, j) += amplitude * sin(frequency * j);
}
}
// 显示原始图像
imshow("Original Image", img);
// 执行傅里叶变换
Mat planes[] = { Mat_<float>(img), Mat::zeros(img.size(), CV_32F) };
Mat complexImg;
merge(planes, 2, complexImg);
dft(complexImg, complexImg);
// 去除正弦噪声
for (int i = 0; i < complexImg.rows; i++)
{
for (int j = 0; j < complexImg.cols; j++)
{
float real = complexImg.at<Vec2f>(i, j)[0];
float imag = complexImg.at<Vec2f>(i, j)[1];
// 计算频率
float freq = sqrt(i * i + j * j);
// 如果频率在噪声频率附近,则将该频率的幅度设置为0
if (freq > frequency * img.cols - amplitude && freq < frequency * img.cols + amplitude)
{
complexImg.at<Vec2f>(i, j)[0] = 0;
complexImg.at<Vec2f>(i, j)[1] = 0;
}
}
}
// 执行傅里叶逆变换
Mat filteredImg;
idft(complexImg, filteredImg, DFT_SCALE | DFT_REAL_OUTPUT);
// 显示去噪后的图像
imshow("Filtered Image", filteredImg);
waitKey(0);
return 0;
}
```
在这个示例中,我们首先加载一张灰度图像,并添加了一个正弦噪声。然后,我们执行傅里叶变换来将图像从空间域转换到频率域。接下来,我们遍历频率域中的每个像素,并检查其频率是否在噪声频率附近。如果是,则将该频率的幅度设置为零,以去除噪声。最后,我们执行傅里叶逆变换以将图像从频率域转换回空间域,并显示去噪后的图像。
opencv图像中频域滤波去除正弦噪声,使用c++代码
以下是使用OpenCV进行频域滤波去除正弦噪声的C++代码示例:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 读取原始图像
Mat img = imread("lena.jpg", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "Failed to read image" << endl;
return -1;
}
// 添加正弦噪声
Mat noise(img.size(), CV_32F);
randn(noise, 0, 20);
Mat img_noise;
img.convertTo(img_noise, CV_32F);
img_noise += noise;
// 显示原始图像和带噪声的图像
imshow("Original Image", img);
imshow("Noisy Image", img_noise / 255.0);
// 傅里叶变换
Mat img_dft;
dft(img_noise, img_dft, DFT_COMPLEX_OUTPUT);
// 计算傅里叶频谱
Mat img_dft_mag;
magnitude(img_dft, img_dft_mag);
// 反变换
Mat img_idft;
idft(img_dft, img_idft, DFT_SCALE | DFT_REAL_OUTPUT);
// 显示频域和空域图像
imshow("Frequency Domain", img_dft_mag / 255.0);
imshow("Spatial Domain", img_idft / 255.0);
// 创建掩模
Mat mask = Mat::zeros(img.size(), CV_32F);
Rect roi(img.cols / 4, img.rows / 4, img.cols / 2, img.rows / 2);
mask(roi) = 1;
// 应用掩模
Mat img_dft_masked;
multiply(img_dft, mask, img_dft_masked);
// 反变换
Mat img_idft_masked;
idft(img_dft_masked, img_idft_masked, DFT_SCALE | DFT_REAL_OUTPUT);
// 显示去噪后的图像
imshow("Denoised Image", img_idft_masked / 255.0);
waitKey();
return 0;
}
```
在此示例中,我们使用了OpenCV的dft,idft,magnitude和multiply函数来执行傅里叶变换,反变换,计算傅里叶频谱和应用掩模。我们还使用了randn函数来添加正弦噪声。掩模是通过创建一个具有ROI(感兴趣区域)的矩形来创建的,其中ROI是原始图像的中央四分之一。最终,我们显示了原始图像,带噪声的图像,傅里叶频谱,空域图像和去噪后的图像。
阅读全文