《数字图像处理》用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;
}
}
}
}
}

请问代码哪里有问题呀,输出的结果跟添加高斯噪声后的图像一样,好像完全没有经过滤波
...全文
279 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

28

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论区
社区管理员
  • 其他技术专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧