均值滤波器的原理及实现
创作时间:
作者:
@小白创作中心
均值滤波器的原理及实现
引用
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 大策略
破解“潮汐困局” 龙泉驿区这条交通动脉通行效率提升47%
进口医疗器械需要哪些资质?
“法律明白人”进农村 打通普法服务最后一公里
从阿姆斯特丹到巴黎的火车之旅:行程、景点与购票指南
直播带货如何提升用户体验?这些细节你注意了吗?
温跃层与盐风化:海洋与岩石的奇妙互动
按揭贷款利率计算方法及条件要求解析
新能源汽车保费为何高于燃油车?多方专家解读原因及解决方案
小番茄含糖量比苹果还低!专家推荐小番茄炒蛋做法,减肥也能放心吃
发酵过程的影响因素及控制方法
线上沟通工具,2025年线上沟通工具优势介绍
平面设计线上工作:机遇与挑战并存
科学合理的座位排布策略:提升活动秩序与互动性
全球拥有最多岛屿的16个国家
“辽宁美”是时间献给世界的礼物
数字经济系列研究 | 算力行业观察:城市算力网络发展研究
千年味蕾传奇:洛阳水席的历史传承与现代创新盛宴
洛阳水席:千年古都的美食传奇
60大寿送什么礼物合适?礼物推荐与选择建议
王莽:复古改革者,短暂篡汉的皇帝
明朝历代皇帝及在位时间整理:十六帝统治概览
新书 | 《称雄天下:早期明王朝与欧亚大陆盟友》
过错推定责任举证责任谁承担:探究法律规定与实际操作
人工智能开启“数智生活”新未来
股票交易零佣金的实现方法:如何实现股票交易零佣金
徐孝嗣:南朝齐时期的重要官员
图的遍历-DFS
如何治疗因颈椎增生骨刺导致的后脑疼痛
房产纠纷找哪个部门管?诉讼流程详解