《数字图像处理》用opencv实现自适应局部降低噪声滤波器
_JoyC 2019-11-22 03:21:37 void ALfilter(Mat &src, Mat &dst, int r, double mu, double sigma) {
//参数分别为:添加高斯噪声后图像、滤波后图像、滤波半径(局部区域设置为正方形)、高斯噪声均值、高斯噪声方差
dst = src.clone();
//Gaussain = src.clone();
int size = 2 * r + 1;//滤波区域大小
//Gaussain = addGaussianNoise(Gaussain, mu, sigma);//给图像添加高斯噪声
double average = 0, variance = 0;//滤波区域像素均值和方差
Mat temp = src.clone();
copyMakeBorder(src, temp, r, r, r, r, BORDER_REFLECT_101);//填充图像边界
//扫描
for (int i = 0; i < temp.rows; i++) {
for (int j = 0; j < temp.cols; j++) {
if (i >= r && j >= r && i < (temp.rows - r) && j < (temp.cols - r)) {
int sum = 0;
int x, y;
//计算滤波区域均值
for (int m = 0; m < size; m++) {
for (int n = 0; n < size; n++) {
x = i + m - r;
y = j + n - r;
sum += temp.at<uchar>(x, y);
}
}
average = 1.0*sum / (size*size);
//计算滤波区域方差
for (int m = 0; m < size; m++) {
for (int n = 0; n < size; n++) {
x = i + m - r;
y = j + n - r;
sum += (1.0*temp.at<uchar>(x, y) - average)*(1.0*temp.at<uchar>(x, y) - average);
}
}
variance = sum / (size*size);
//按照自适应局部降低噪声滤波器的计算公式求输出的像素值
double c = (sigma*sigma) / (variance*variance);
int pix = round(temp.at<uchar>(i, j) - c * (temp.at<uchar>(i, j) - average));
if (pix < 0) {
dst.at<uchar>(i - r, j - r) = 0;
}
else if (pix > 255) {
dst.at<uchar>(i - r, j - r) = 255;
}
else {
dst.at<uchar>(i - r, j - r) = pix;
}
}
}
}
}
请问代码哪里有问题呀,输出的结果跟添加高斯噪声后的图像一样,好像完全没有经过滤波