opencv通过傅里叶变换去除图像规律噪声的c++代码
时间: 2023-11-04 12:16:01 浏览: 84
以下是使用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;
}
```
代码中的高斯滤波器通过计算每个像素与中心像素的距离来计算权重,距离越大的像素权重越小,距离越小的像素权重越大。高斯滤波器的半径参数可以根据实际需求进行调整。
阅读全文