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)

效果对比:

  • 均值滤波:图像变模糊,边缘损伤严重;
  • 高斯滤波:去噪柔和,但仍会模糊边缘;
  • 中值滤波:保边效果最明显。
相关推荐
那个村的李富贵13 小时前
光影魔术师:CANN加速实时图像风格迁移,让每张照片秒变大师画作
人工智能·aigc·cann
腾讯云开发者15 小时前
“痛点”到“通点”!一份让 AI 真正落地产生真金白银的实战指南
人工智能
CareyWYR15 小时前
每周AI论文速递(260202-260206)
人工智能
hopsky16 小时前
大模型生成PPT的技术原理
人工智能
禁默16 小时前
打通 AI 与信号处理的“任督二脉”:Ascend SIP Boost 加速库深度实战
人工智能·信号处理·cann
心疼你的一切17 小时前
昇腾CANN实战落地:从智慧城市到AIGC,解锁五大行业AI应用的算力密码
数据仓库·人工智能·深度学习·aigc·智慧城市·cann
AI绘画哇哒哒17 小时前
【干货收藏】深度解析AI Agent框架:设计原理+主流选型+项目实操,一站式学习指南
人工智能·学习·ai·程序员·大模型·产品经理·转行
数据分析能量站17 小时前
Clawdbot(现名Moltbot)-现状分析
人工智能
那个村的李富贵17 小时前
CANN加速下的AIGC“即时翻译”:AI语音克隆与实时变声实战
人工智能·算法·aigc·cann
二十雨辰17 小时前
[python]-AI大模型
开发语言·人工智能·python