OpenCV(二十七):中值滤波

中值滤波(Median Filter)是一种在图像处理系统中被广泛采用的非线性滤波算法,主要用于去除脉冲噪声(Salt & Pepper Noise)和消除图像中的孤立噪点。相比均值滤波,中值滤波在保留边缘方面具有明显优势,因此在图像预处理阶段非常常用,如去噪、边缘检测前的降噪等。

椒盐噪声

椒盐噪声是一种典型的 脉冲噪声(Impulse Noise),表现为:

  • 随机出现的 极亮点(255,salt)
  • 极暗点(0,pepper)
  • 像素值与周围真实像素差异极大

例如:

正常像素值可能在 100~150 之间

但噪声可能突变为 0 或 255

特点:噪声像素是"异常值(Outlier)",比周围像素跳跃巨大。

这些极端值对线性滤波器(均值、高斯)影响很大,但对中值滤波影响很小。

基本原理

中值滤波属于典型的 基于排序统计(Order Statistics) 的非线性滤波方法。它的基本思想可以概括为:

取当前像素邻域内的所有像素值,排序后取中间的那个值作为输出像素。

假设我们使用一个 3×3 的滤波窗口,以图像中的一个像素 P 为中心,取其周围共 9 个像素,按灰度值从小到大排序:

例:周围像素为:

复制代码
23, 25, 90, 110, 120, 150, 155, 200, 255

排序后为:

复制代码
23, 25, 90, 110, 120, 150, 155, 200, 255

中间的那个值是第 5 个:120

因此,原中心像素 P 被替换为 120。

数学表达

设邻域为 Ω,邻域中的像素集合为:

排序后得到:

中值滤波输出为:

该公式说明中值滤波器利用排序统计特性,而不是线性加权求和,因此具有显著的抗噪声能力。

主要特点

优点

  • 对椒盐噪声(黑白强干扰点)尤其有效
    中值滤波几乎是去除椒盐噪声的最佳选择,能在不明显模糊图像的情况下有效抑制异常值。
  • 比均值滤波更好地保留边缘
    因为不进行像素平均,因此边缘不会被模糊。
  • 简单稳定、计算量适中,适合实时处理

缺点

  • 对高斯噪声等连续噪声不如均值滤波有效;
  • 大窗口中值滤波会丢失细节;
  • 排序操作在大窗口下计算较耗时,但现代 CPU/GPU 差距不明显。

适用场景

  1. 处理含椒盐噪声的监控视频或拍照图像
  2. 图像边缘检测前的预降噪
  3. 医学影像预处理(如 MRI、CT 图像)
  4. 道路识别、车牌识别等需要保护边缘的场景
  5. 去除图像孤立亮点或黑点

OpenCV中的中值滤波函数

OpenCV 提供的函数为:

python 复制代码
cv2.medianBlur(src, ksize)

参数说明:

  • src:原始图像;
  • ksize:核大小,只能是 奇数,例如 3、5、7...;
  • 输出图像与输入图像大小相同。

注意:ksize 必须是奇数且 ≥ 3

原因在于:

  • 奇数才有唯一的中间值;
  • 核大小越大,滤波越强,但可能损失更多细节。

示例

去除椒盐噪声

python 复制代码
import cv2
import numpy as np

img = cv2.imread('input.jpg', 0)  # 灰度图
noise = img.copy()

# 添加椒盐噪声
salt_pepper_prob = 0.02
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        r = np.random.rand()
        if r < salt_pepper_prob:
            noise[i][j] = 0       # 黑点
        elif r > 1 - salt_pepper_prob:
            noise[i][j] = 255     # 白点

# 中值滤波处理
denoised = cv2.medianBlur(noise, 5)

cv2.imshow("Salt&Pepper Noise", noise)
cv2.imshow("Denoised by Median", denoised)
cv2.waitKey(0)

执行效果:

与均值滤波、高斯滤波对比

python 复制代码
import cv2

img = cv2.imread('test.jpg')

# 均值滤波
mean = cv2.blur(img, (5,5))

# 高斯滤波
gaussian = cv2.GaussianBlur(img, (5,5), 1)

# 中值滤波
median = cv2.medianBlur(img, 5)

cv2.imshow('Original', img)
cv2.imshow('Mean Blur', mean)
cv2.imshow('Gaussian Blur', gaussian)
cv2.imshow('Median Blur', median)
cv2.waitKey(0)

效果对比:

  • 均值滤波:图像变模糊,边缘损伤严重;
  • 高斯滤波:去噪柔和,但仍会模糊边缘;
  • 中值滤波:保边效果最明显。
相关推荐
大模型最新论文速读4 分钟前
SkillOpt:把 skill 文档当成模型权重来训练
论文阅读·人工智能·深度学习·机器学习·自然语言处理
吃好睡好便好4 分钟前
矩阵的左乘和右乘
人工智能·学习·线性代数·算法·matlab·矩阵
俊哥V5 分钟前
每日 AI 研究简报 · 2026-05-30
人工智能·ai
陕西企来客6 分钟前
陕西 RAG 权重调整技术对于 GEO 优化的深度调查:企来客逆 RAG 技术升级真相揭示
人工智能
Aloudata10 分钟前
AI 黑盒生成 vs 原子语义组合:企业指标生产路径深度对比
大数据·人工智能·数据分析·指标平台·语义层
星辰AI10 分钟前
Function Calling 技术实现:让 AI 与世界交互
人工智能·ai·语言模型
把你拉进白名单10 分钟前
3.OpenClaw源码解析_通道的概念
人工智能
CoLiuRs11 分钟前
构建 AI 原生企业:从架构原则到工程落地
人工智能·架构
Lkstar12 分钟前
Temperature 与 Top P:大模型输出的"调音台"
人工智能
段一凡-华北理工大学16 分钟前
工业领域的Hadoop架构学习~系列文章04:YARN资源调度架构
人工智能·hadoop·学习·架构·系统架构·高炉炼铁·高炉炼铁智能化