opencv去除图像规律噪声的c++代码
时间: 2023-11-06 13:59:29 浏览: 37
这里提供一种基于高斯滤波的方法去除图像规律噪声的C++代码:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 读取图像
Mat img = imread("noise_image.png", IMREAD_GRAYSCALE);
// 显示原始图像
namedWindow("Original", WINDOW_NORMAL);
imshow("Original", img);
// 高斯滤波
Mat blurred;
GaussianBlur(img, blurred, Size(5, 5), 0);
// 显示滤波后的图像
namedWindow("Blurred", WINDOW_NORMAL);
imshow("Blurred", blurred);
// 保存处理后的图像
imwrite("processed_image.png", blurred);
waitKey(0);
return 0;
}
```
这里以读取名为“noise_image.png”的灰度图像为例,首先显示原始图像,然后使用高斯滤波去除图像中的规律噪声,最后显示处理后的图像,并将其保存为“processed_image.png”。可以根据实际情况调整高斯滤波的卷积核大小和标准差。
相关问题
opencv去除图像正弦噪声的c++代码
以下是使用opencv去除图像正弦噪声的c++代码:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("image.jpg", IMREAD_GRAYSCALE); //读取图像并转为灰度图像
if (image.empty())
{
cout << "Could not open or find the image" << endl;
return -1;
}
Mat noise = Mat::zeros(image.rows, image.cols, CV_8U); //生成正弦噪声
float freq = 20; //正弦噪声的频率
float ampl = 30; //正弦噪声的振幅
for (int i = 0; i < noise.rows; i++)
{
for (int j = 0; j < noise.cols; j++)
{
noise.at<uchar>(i, j) = ampl * sin(freq * i) + ampl * sin(freq * j);
}
}
Mat noisyImage = image + noise; //图像添加噪声
imshow("Noisy Image", noisyImage); //显示带噪声的图像
Mat denoisedImage;
medianBlur(noisyImage, denoisedImage, 5); //中值滤波去除噪声
imshow("Denoised Image", denoisedImage); //显示去噪后的图像
waitKey(0); //等待按键
return 0;
}
```
该代码首先读取一张图像,并生成正弦噪声。然后将正弦噪声添加到图像中,并使用中值滤波去除噪声。最后,显示带噪声的图像和去噪后的图像。
opencv通过傅里叶变换去除图像规律噪声的c++代码
以下是使用OpenCV在C++中实现傅里叶变换去除图像规律噪声的代码:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
// 读取图像
Mat img = imread("lena.jpg", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "Failed to load image" << endl;
return -1;
}
// 对图像进行傅里叶变换
Mat complexImg;
dft(img, complexImg, DFT_COMPLEX_OUTPUT);
// 将频谱中心移动到图像中心
Mat shiftedImg;
fftshift(complexImg, shiftedImg);
// 计算幅度谱
Mat magImg;
magnitude(shiftedImg, magImg);
// 计算对数幅度谱
Mat logMagImg;
log(magImg + 1, logMagImg);
// 阈值化对数幅度谱
Mat thresholdImg;
threshold(logMagImg, thresholdImg, 0, 255, THRESH_BINARY | THRESH_OTSU);
// 根据阈值生成掩膜
Mat mask;
thresholdImg.convertTo(mask, CV_32FC1, 1.0 / 255.0);
// 将掩膜应用到频谱上
Mat filteredComplexImg;
multiply(shiftedImg, mask, filteredComplexImg);
// 将频谱中心移回原来位置
Mat unshiftedImg;
ifftshift(filteredComplexImg, unshiftedImg);
// 对图像进行傅里叶反变换
Mat filteredImg;
idft(unshiftedImg, filteredImg, DFT_SCALE | DFT_REAL_OUTPUT);
// 显示原始图像和去噪后的图像
namedWindow("Original Image", WINDOW_NORMAL);
imshow("Original Image", img);
namedWindow("Filtered Image", WINDOW_NORMAL);
imshow("Filtered Image", filteredImg);
waitKey(0);
return 0;
}
其中,fftshift()函数用于将频谱中心移动到图像中心,ifftshift()函数用于将频谱中心移回原来位置。