opencv通过傅里叶变换去除图像余弦噪声的c++代码
时间: 2023-11-04 18:14:29 浏览: 163
以下是opencv通过傅里叶变换去除图像余弦噪声的C++代码:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("lena.jpg", IMREAD_GRAYSCALE);
Mat noise(img.size(), CV_32F);
randn(noise, 0, 32); // 添加高斯噪声
Mat noisyImg;
img.convertTo(noisyImg, CV_32F);
noisyImg += noise; // 添加噪声
Mat planes[] = {Mat_<float>(noisyImg), Mat::zeros(noisyImg.size(), CV_32F)};
Mat complexImg;
merge(planes, 2, complexImg); // 构造复数图像
dft(complexImg, complexImg); // 傅里叶变换
Mat mag, phase;
split(complexImg, planes); // 分离实部和虚部
magnitude(planes[0], planes[1], mag); // 计算幅值
phase = Mat(planes[1].size(), CV_32F);
phase = atan2(planes[1], planes[0]); // 计算相位
Mat filteredMag;
GaussianBlur(mag, filteredMag, Size(5, 5), 0); // 高斯滤波
Mat planes2[] = {filteredMag.mul(cos(phase)), filteredMag.mul(sin(phase))};
Mat complexImg2;
merge(planes2, 2, complexImg2); // 构造复数图像
idft(complexImg2, complexImg2); // 傅里叶反变换
Mat planes3[] = {Mat::zeros(img.size(), CV_32F), Mat::zeros(img.size(), CV_32F)};
split(complexImg2, planes3); // 分离实部和虚部
Mat restoredImg;
magnitude(planes3[0], planes3[1], restoredImg); // 计算幅值
normalize(restoredImg, restoredImg, 0, 255, NORM_MINMAX, CV_8U); // 归一化
imshow("Original Image", img);
imshow("Noisy Image", noisyImg);
imshow("Restored Image", restoredImg);
waitKey();
return 0;
}
```
这段代码首先读入一张灰度图像,然后添加高斯噪声。接着,将图像转换为浮点型,并构造出复数图像。对复数图像进行傅里叶变换,得到实部和虚部。分别计算幅值和相位。对幅值进行高斯滤波,并根据相位重新构造出复数图像。对复数图像进行傅里叶反变换,得到恢复后的图像。最后,将恢复后的图像归一化并显示出来。
阅读全文