均值滤波器的原理及实现
创作时间:
作者:
@小白创作中心
均值滤波器的原理及实现
引用
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) 右侧为标准均值处理结果
从效果对比可以看出:
- 标准均值滤波器对图像进行了均匀的模糊处理
- 带权重的均值滤波器在保持中心像素的同时对周围像素进行模糊,能够更好地保留图像细节
总结
均值滤波器是一种简单而有效的图像降噪和细节去除工具。虽然它能够很好地降低噪声,但也会导致边缘模糊。在实际应用中,需要根据具体需求选择合适的滤波器类型和参数。
热门推荐
思维可视化工具在初中数学几何教学中的应用研究
有粉丝问黄金什么时候暴跌?回顾历史上5次著名的黄金暴跌事件!
黄金价值涨跌原因全解析:从经济形势到地缘政治
生命才是最大的财富:《唤醒意志的自我教育之路》
解码广州黄埔四千年文明层累与当代活化实践
喀什古城:居民生活品质跃升 文旅产业持续发展
企业财务内部风险管控:六大环节的风险点与解决方案
法院提交证据清单的法律要求与实务操作要点
进行酒店市场调研的有效方法探究
白糖:“战时黄金”的不为人知的秘密
如何优化家庭预算以应对月供压力?这些预算策略如何提高生活质量?
掌握双道法,轻松提升你的学习效率与记忆力
佛山十大特色名小吃,舌尖上的佛山,品味岭南风情
企业短视频营销:如何实现内容创新与模式优化
如何通过质量管理提升企业的品牌形象
信用风险管理策略——有效预防及应对信用风险的关键举措
右脚中指肿痛怎么办
美国临床肿瘤学会指南:癌症患者治疗期间如何正确运动?
砂锅黄焖鸡:一道暖身又暖心的家常美味
开启严管模式!咪达唑仑这个精神药品管制升级
宋仲基和金秀贤15年后同台飚戏:没有比这更残忍的对比了
亚马逊自发货如何选择合适的物流渠道?全球贸易物流方式解析
老君山:一座集自然美景与人文历史于一体的道教名山
老君山:道教文化与自然美景的完美融合
面部毛孔粗大、黑头多除了要定期护肤,还可以试一试这些方法~
面对黑头,疑似失去了所有手段和力气
揭秘中国射击队训练方法:从基础到实战的全方位训练体系
朗吉弩斯美学思想探析
李林880和李艳芳900,哪本更契合真题?
规划25万平,梅林这里将新增住宅+18班小学,华润主导!