OpenCV——均值滤波

目录

一、均值滤波

1、核心定义

   均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即包括目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

   均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点 ( x , y ) (x,y) (x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点 ( x , y ) (x,y) (x,y),作为处理后图像在该点上的灰度 g ( x , y ) g(x,y) g(x,y),即 g ( x , y ) = ∑ f ( x , y ) / m g(x,y)=∑f(x,y)/m g(x,y)=∑f(x,y)/m, m m m为该模板中包含当前像素在内的像素总个数。

   均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。

常规滤波模板:常用奇数尺寸卷积核(3×3、5×5、9×9),保证像素中心点唯一,3×3模板默认包含中心像素+周边8邻域像素,共计9个像素参与均值计算。

2、计算公式

   设原始图像像素灰度值为 f ( x , y ) f(x,y) f(x,y),滤波后图像像素灰度值为 g ( x , y ) g(x,y) g(x,y),滤波模板内总像素数量为 m m m,公式如下:

g ( x , y ) = 1 m ∑ f ( x , y ) g(x,y)=\frac{1}{m}\sum f(x,y) g(x,y)=m1∑f(x,y)

举例:3×3卷积核 m = 9 m=9 m=9,取邻域9个像素求和后除以9,赋值给中心像素;卷积核尺寸越大,参与均值计算像素越多,图像平滑效果越强。

3、算法优缺点

✅ 优点

  • 算法逻辑简单、计算速度快、硬件算力开销低,实时性较好
  • 对均匀分布高斯噪声、轻度椒盐噪声降噪效果直观,适配预处理场景
  • OpenCV内置封装函数,无需手动编写遍历卷积逻辑,调用极简

❌ 固有缺陷

  • 全局均等加权:模板内所有像素权重一致,降噪无区分度,极易破坏图像边缘、纹理、细节特征
  • 卷积核尺寸越大,图像模糊程度越高,细节丢失越严重
  • 对重度椒盐噪声降噪能力差,无法针对性保留有效像素、剔除噪点像素

4、函数详解

通用API:

cpp 复制代码
blur(src, dst, ksize, anchor, borderType)
  1. src:输入原始图像,支持灰度图、彩色三通道BGR图像
  2. dst:输出滤波后图像,尺寸、通道数与原图完全一致
  3. ksize:卷积核尺寸 Size(w,h),建议取奇数长宽(3/5/9),偶数核会出现像素偏移
  4. anchor:锚点,默认(-1,-1),代表卷积核中心点
  5. borderType:图像边缘填充方式,默认自动填充,无需手动修改

二、C++代码

cpp 复制代码
#include <opencv2\opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat img = imread("hx.jpg");
	
	if (img.empty() )
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	Mat result_3, result_9; //存放滤波结果,数字代表滤波器尺寸
	
	//调用均值滤波函数blur()进行滤波
	blur(img, result_3, Size(3, 3)); // 3x3卷积核
	blur(img, result_9, Size(9, 9)); // 9x9卷积核
	
	//显示处理结果
	imshow("origion pic ", img);
	imshow("3x3 result", result_3);
	imshow("9x9 salt", result_9);
	waitKey(0);
	return 0;
}

三、python代码

python 复制代码
import cv2

# 读取同级目录加盐噪声图像
img = cv2.imread('hx.jpg')

# 图像读取异常判断
if img is None:
    print("图像读取失败,请检查图片路径与文件名!")
    exit()

# -------------------均值滤波核心代码------------------
# 3×3卷积核滤波:轻度平滑降噪
img_mean_3 = cv2.blur(img, (3, 3))
# 9×9卷积核滤波:高强度平滑降噪
img_mean_9 = cv2.blur(img, (9, 9))

# ------------------可视化结果(已修复原版赋值bug)-----------------
cv2.imshow('原始噪声图像', img)
cv2.imshow('3x3卷积滤波结果', img_mean_3)
cv2.imshow('9x9卷积滤波去噪结果', img_mean_9)

# 按键等待+资源释放
cv2.waitKey(0)
cv2.destroyAllWindows()

四、结果展示

1、原始图像

2、3x3卷积

3、9x9卷积