opencv实现巴特沃斯低通滤波器
时间: 2024-04-26 22:19:07 浏览: 163
使用Qt和OpenCV做的图像低通滤波器
巴特沃斯低通滤波器是一种常用的频域滤波器,可以用于图像平滑处理。在OpenCV中,可以使用函数`cv2.dft()`和`cv2.idft()`来实现巴特沃斯低通滤波器。
下面是一个使用OpenCV实现巴特沃斯低通滤波器的示例代码[^1]:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("input.jpg", IMREAD_GRAYSCALE); // 读取灰度图像
if (image.empty())
{
cout << "Could not open or find the image" << endl;
return -1;
}
padded; // 扩展输入图像尺寸到最佳尺寸
int m = getOptimalDFTSize(image.rows);
int n = getOptimalDFTSize(image.cols);
copyMakeBorder(image, padded, 0, m - image.rows, 0, n - image.cols, BORDER_CONSTANT, Scalar::all(0));
Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
Mat complexImage;
merge(planes, 2, complexImage); // 创建一个复数类型的Mat对象
dft(complexImage, complexImage); // 傅里叶变换
// 构建巴特沃斯低通滤波器
float d0 = 30; // 截止频率
int n1 = 2; // 阶数
Mat filter = Mat(complexImage.size(), CV_32F);
Point center = Point(complexImage.cols / 2, complexImage.rows / 2);
for (int i = 0; i < complexImage.rows; i++)
{
for (int j = 0; j < complexImage.cols; j++)
{
float d = sqrt(pow(i - center.y, 2) + pow(j - center.x, 2));
filter.at<float>(i, j) = 1 / (1 + pow(d / d0, 2 * n1));
}
}
// 应用滤波器
Mat filteredImage;
mulSpectrums(complexImage, filter, filteredImage, 0);
// 反傅里叶变换
idft(filteredImage, filteredImage);
// 提取实部
Mat result;
split(filteredImage, planes);
magnitude(planes, planes, result);
// 归一化并显示结果
normalize(result, result, 0, 255, NORM_MINMAX);
result.convertTo(result, CV_8U);
imshow("Input Image", image);
imshow("Filtered Image", result);
waitKey(0);
return 0;
}
```
请注意,上述代码中的`input.jpg`是输入图像的文件名,你需要将其替换为你自己的图像文件名。此外,你还可以根据需要调整截止频率`d0`和阶数`n1`来控制滤波效果。
阅读全文