C++实现自适应双边滤波算法
时间: 2023-08-12 18:18:17 浏览: 156
自适应双边滤波算法是一种常用的图像滤波算法,其可以在保持图像边缘信息的同时去除图像噪声。下面是C++实现自适应双边滤波算法的代码,具体注释见代码中:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
// 定义自适应双边滤波函数
Mat adaptive_bilateral_filter(Mat input, int size, double sigma_d, double sigma_r)
{
Mat output = Mat::zeros(input.size(), input.type()); // 初始化输出图像
int radius = size / 2; // 计算滤波半径
int rows = input.rows;
int cols = input.cols;
int channels = input.channels();
double c1 = 1.0 / (2.0 * sigma_d * sigma_d); // 计算常数C1
double c2 = 1.0 / (2.0 * sigma_r * sigma_r); // 计算常数C2
// 对每个像素进行滤波处理
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
double sum1 = 0.0;
double sum2 = 0.0;
for (int k = -radius; k <= radius; k++) {
for (int l = -radius; l <= radius; l++) {
int row = i + k;
int col = j + l;
if (row >= 0 && row < rows && col >= 0 && col < cols) {
double d = sqrt((double)k * k + (double)l * l); // 计算欧式距离
double w1 = exp(-c1 * d * d); // 计算空域权重
double diff = input.at<uchar>(i, j) - input.at<uchar>(row, col); // 计算像素值差异
double w2 = exp(-c2 * diff * diff); // 计算灰度值权重
sum1 += w1 * w2 * input.at<uchar>(row, col); // 计算加权像素值之和
sum2 += w1 * w2; // 计算加权权重之和
}
}
}
output.at<uchar>(i, j) = (uchar)(sum1 / sum2); // 更新输出图像像素值
}
}
return output;
}
int main()
{
Mat input = imread("lena.jpg", IMREAD_GRAYSCALE); // 读取灰度图像
if (input.empty()) {
cout << "读取图像失败!" << endl;
return -1;
}
Mat output = adaptive_bilateral_filter(input, 11, 10.0, 10.0); // 自适应双边滤波
imshow("input", input);
imshow("output", output);
waitKey(0);
return 0;
}
```
其中,`adaptive_bilateral_filter()`函数是自适应双边滤波的具体实现函数,输入参数包括原始图像`input`、窗口大小`size`、空域标准差`sigma_d`和灰度值标准差`sigma_r`,输出参数为滤波后的图像`output`。
在`main()`函数中,首先读取灰度图像`input`,然后调用`adaptive_bilateral_filter()`函数进行自适应双边滤波,并将结果保存在`output`中,最后显示原始图像和滤波后的图像。
阅读全文