opencv去除图像规律噪声的c++代码
时间: 2023-11-06 08:59:29 浏览: 94
这里提供一种基于高斯滤波的方法去除图像规律噪声的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>
using namespace cv;
int main()
{
// 读取图像
Mat image = imread("test.jpg", IMREAD_GRAYSCALE);
// 对图像进行傅里叶变换
Mat planes[] = { Mat_<float>(image), Mat::zeros(image.size(), CV_32F) };
Mat complexI;
merge(planes, 2, complexI);
dft(complexI, complexI);
// 计算傅里叶变换的幅值图像
Mat magnitude;
split(complexI, planes);
magnitude = planes[0];
magnitude += Scalar::all(1);
log(magnitude, magnitude);
// 对傅里叶变换的幅值图像进行中心化
int cx = magnitude.cols / 2;
int cy = magnitude.rows / 2;
Mat q0(magnitude, Rect(0, 0, cx, cy));
Mat q1(magnitude, Rect(cx, 0, cx, cy));
Mat q2(magnitude, Rect(0, cy, cx, cy));
Mat q3(magnitude, Rect(cx, cy, cx, cy));
Mat tmp;
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);
// 设定高频滤波器的半径
int radius = 50;
// 构建高斯滤波器
Mat gaussianFilter = Mat::zeros(magnitude.size(), CV_32F);
for (int i = 0; i < magnitude.rows; i++)
{
for (int j = 0; j < magnitude.cols; j++)
{
int dx = abs(i - cy);
int dy = abs(j - cx);
if (dx > magnitude.rows / 2)
{
dx = magnitude.rows - dx;
}
if (dy > magnitude.cols / 2)
{
dy = magnitude.cols - dy;
}
double distance = sqrt(dx * dx + dy * dy);
gaussianFilter.at<float>(i, j) = exp(-(distance * distance) / (2 * radius * radius));
}
}
// 将高斯滤波器应用到傅里叶变换的幅值图像上
Mat filteredMagnitude;
multiply(magnitude, gaussianFilter, filteredMagnitude);
// 计算傅里叶变换的相位图像
Mat phase;
phase = planes[1].clone();
// 将中心化的幅值图像和相位图像合并为一个复数图像
Mat filteredComplexI;
Mat filteredPlanes[] = { Mat_<float>(filteredMagnitude), phase };
merge(filteredPlanes, 2, filteredComplexI);
// 对复数图像进行傅里叶反变换
Mat filteredImage;
idft(filteredComplexI, filteredImage, DFT_SCALE | DFT_REAL_OUTPUT);
// 显示原始图像和去噪后的图像
imshow("Original Image", image);
imshow("Filtered Image", filteredImage);
waitKey(0);
return 0;
}
```
代码中的高斯滤波器通过计算每个像素与中心像素的距离来计算权重,距离越大的像素权重越小,距离越小的像素权重越大。高斯滤波器的半径参数可以根据实际需求进行调整。
opencv去除图像的正弦噪声,c++代码
以下是使用opencv在c语言中去除图像正弦噪声的示例代码:
```c
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("image.jpg", IMREAD_GRAYSCALE); // 读取灰度图像
Mat img_fft;
dft(img, img_fft, DFT_COMPLEX_OUTPUT); // 进行离散傅里叶变换
Mat mag, phase;
split(img_fft, mag, phase); // 分离幅值和相位
// 构建滤波器
int rows = mag.rows;
int cols = mag.cols;
Mat filter(rows, cols, CV_32FC2, Scalar(1, 1));
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
filter.at<Vec2f>(i, j)[0] = (i < rows / 2) ? 1 : 0;
filter.at<Vec2f>(i, j)[1] = (j < cols / 2) ? 1 : 0;
}
}
// 应用滤波器
Mat filtered_fft;
multiply(img_fft, filter, filtered_fft);
// 进行逆变换
Mat filtered_img;
idft(filtered_fft, filtered_img, DFT_SCALE | DFT_REAL_OUTPUT);
// 显示结果
imshow("Original Image", img);
imshow("Filtered Image", filtered_img);
waitKey(0);
return 0;
}
```
这个代码首先读取灰度图像,然后使用离散傅里叶变换将其转换到频域。接下来,我们将幅值和相位分离开来,构建一个滤波器并将其应用于频域表示。最后,我们使用逆变换将图像转换回空域,并显示原始图像和滤波后的图像。
阅读全文