opencv通过傅里叶变换去除图像规律噪声的c++代码
时间: 2023-11-04 12:45:00 浏览: 139
以下是使用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()函数用于将频谱中心移回原来位置。
阅读全文