均值滤波器的原理及实现
创作时间:
作者:
@小白创作中心
均值滤波器的原理及实现
引用
CSDN
1.
https://blog.csdn.net/u013263891/article/details/83048641
均值滤波器是图像处理中一种常用的线性空间滤波器,主要用于降低图像噪声和去除不相关细节。本文将详细介绍均值滤波器的原理,并通过C++和OpenCV实现其功能,最后展示不同处理方式的效果对比。
1. 均值滤波器原理
平滑线性空间滤波器的输出是包含在滤波器模板邻域内的像素的简单平均值,也就是均值滤波器。均值滤波器也是低通滤波器,其主要作用是将邻域内的平均值赋给中心元素。
均值滤波器的主要应用包括:
- 降低噪声
- 去除图像中的不相关细节
- 模糊图片以便得到感兴趣物体的粗略描述
模板的大小由那些即将融入背景中的物体尺寸决定。然而,均值滤波器也存在边缘模糊的缺点。
均值滤波器的模板可以分为标准像素平均和加权平均两种类型。
2. C++实现均值滤波器
下面通过C++和OpenCV实现均值滤波器:
#include <iostream>
#include<opencv2/opencv.hpp>
// 计算标准均值滤波器的权重
void getCount(double *count, int dim) {
int mn = dim * dim;
for (int i = 0; i < dim * dim; i++) {
count[i] = 1.0 / mn;
}
}
// 计算加权均值滤波器的权重
void getCountWeight(double *count, int dim) {
int mn = dim * dim;
for (int i = 0; i < mn; i++) {
if (i == mn / 2)
count[i] = 1. / 2;
else
count[i] = (1 / 2.) * (1. / (mn - 1));
}
}
// 均值滤波器函数
void meanFilter(cv::Mat &dst, cv::Mat &img, int dim) {
int channels = img.channels();
dst = cv::Mat::zeros(img.size(), img.type());
double count[dim * dim] = {0};
getCountWeight(count, dim);
for (int row = 0; row < img.rows; row++) {
for (int col = 0; col < img.cols; col++) {
if (row >= dim / 2 && row < img.rows - dim / 2 && col >= dim / 2 && col < img.cols - dim / 2) {
int c = 0;
double sum1 = 0;
double sum2 = 0;
double sum3 = 0;
for (int i = row - dim / 2; i <= row + dim / 2; i++) {
for (int j = col - dim / 2; j <= col + dim / 2; j++) {
if (channels == 1) {
sum1 += count[c] * img.at<uchar>(i, j);
} else if (channels == 3) {
sum1 += count[c] * img.at<cv::Vec3b>(i, j)[0];
sum2 += count[c] * img.at<cv::Vec3b>(i, j)[1];
sum3 += count[c] * img.at<cv::Vec3b>(i, j)[2];
}
c++;
}
}
if (channels == 1) {
dst.at<uchar>(row, col) = (int)sum1;
} else if (channels == 3) {
dst.at<cv::Vec3b>(row, col)[0] = (int)sum1;
dst.at<cv::Vec3b>(row, col)[1] = (int)sum2;
dst.at<cv::Vec3b>(row, col)[2] = (int)sum3;
}
} else {
if (channels == 1)
dst.at<uchar>(row, col) = img.at<uchar>(row, col);
else if (channels == 3) {
dst.at<cv::Vec3b>(row, col)[0] = img.at<cv::Vec3b>(row, col)[0];
dst.at<cv::Vec3b>(row, col)[1] = img.at<cv::Vec3b>(row, col)[1];
dst.at<cv::Vec3b>(row, col)[2] = img.at<cv::Vec3b>(row, col)[2];
}
}
}
}
}
int main() {
cv::Mat src = cv::imread("/home/dyf/Documents/数字图像/空间滤波器/Mean-filter/3.png", 0);
cv::Mat dst, dst1;
cv::imshow("src", src);
meanFilter(dst, src, 3);
cv::imshow("dst", dst);
cv::blur(src, dst1, cv::Size(3, 3));
cv::imshow("dst1", dst1);
cv::waitKey(0);
return 0;
}
3. 均值滤波器处理效果
以下是使用不同方法处理的效果对比:
原图像
左侧为带权重均值处理结果(中心位置为0.5,其他的邻域平分0.5) 右侧为标准均值处理结果
左侧为带权重均值处理结果(中心位置为0.5,其他的邻域平分0.5) 右侧为标准均值处理结果
左侧为带权重均值处理结果(中心位置为0.5,其他的邻域平分0.5) 右侧为标准均值处理结果
左侧为带权重均值处理结果(中心位置为0.5,其他的邻域平分0.5) 右侧为标准均值处理结果
从效果对比可以看出:
- 标准均值滤波器对图像进行了均匀的模糊处理
- 带权重的均值滤波器在保持中心像素的同时对周围像素进行模糊,能够更好地保留图像细节
总结
均值滤波器是一种简单而有效的图像降噪和细节去除工具。虽然它能够很好地降低噪声,但也会导致边缘模糊。在实际应用中,需要根据具体需求选择合适的滤波器类型和参数。
热门推荐
佛山西站新增列车,周末游攻略出炉!
佛山西站大升级!广佛南环即将开通,春运新增111列临客
春节回家攻略:佛山西站最新时刻表出炉
佛山西站春运首日大变样!购票乘车全攻略来了
慢性心肌缺血怎么治疗
洋葱炒蛋:健康早餐的新宠
海蜇食用安全指南:营养价值、加工标准与食用方法全解析
夏日清凉必备:海蜇的正确打开方式
两个实用动作,轻松缓解肠胃胀气
饮食调整告别尴尬放屁时刻
放屁频繁?小心你的饮食坑了你!
饮食调整小妙招,轻松告别频繁放屁
精神药物基因检测助力个体化用药,让治疗更精准
瑞利散射(Rayleigh scattering)
腊月十七“蛐蜒蝎子节”,食5样做3事,遵循传统保平安
腊月十七:吃三样、做一事、忌一事,传统习俗里的文化传承
四海云游太平森林公园游玩攻略
煎鸡蛋减肥新花样,4款美味食谱大公开!
肺结核治疗——饮食指南
压岁钱:从汉代厌胜钱到现代红包
三元锂电池PK磷酸铁锂:谁将主导新能源汽车的未来?
纯电动汽车商业模式创新:从“大而全”到共享出行
完美煎蛋挑战:你也能煎出大师级美味
西蓝花和虾仁,谁才是煎鸡蛋的最佳拍档?
OKR:重塑企业文化的利器
安迪·格鲁夫与OKR的崛起之路
谷歌都在用的OKR,助你职场升级
支付宝每月神秘扣款解密:如何设置与关闭自动扣费?
煎鸡蛋竟暗藏健康危机?小心糖化蛋白!
煎鸡蛋大赛,谁能成为厨房达人?