OpenCV 实战:为视频添加椒盐噪声并实现中值滤波去噪

在计算机视觉领域,噪声处理是图像和视频预处理的重要环节。椒盐噪声(Pepper and Salt Noise)是一种常见的图像噪声,表现为图像中随机出现的黑色(椒)和白色(盐)像素点。本文将基于 Python 和 OpenCV 库,实现为视频逐帧添加椒盐噪声,并使用中值滤波算法去除噪声的完整流程。

一、核心原理介绍

1.1 椒盐噪声

椒盐噪声属于脉冲噪声,其生成逻辑是:在图像的随机位置上,将像素值强制设置为 0(黑色,椒噪声)或 255(白色,盐噪声)。噪声数量越多,图像失真越严重,本次案例中默认生成 10000 个噪声点。

1.2 中值滤波

中值滤波是处理椒盐噪声的经典算法,核心原理是:用像素点邻域内的中值 替代该像素点的原始值。由于椒盐噪声的像素值为 0 或 255(极值),在邻域中值计算时会被排除,因此能有效去除椒盐噪声,同时保留图像的边缘信息。OpenCV 中medianBlur函数默认使用奇数尺寸的核(如 3×3)进行滤波。

二、完整代码实现与解析

2.1 椒盐噪声生成函数

python 复制代码
import cv2
import numpy as np

def add_peppersalt_noise(image, n=10000):
    """
    为图像添加椒盐噪声
    :param image: 输入图像(OpenCV读取的BGR格式)
    :param n: 噪声点数量,默认10000个
    :return: 添加噪声后的图像
    """
    # 复制原图像,避免修改原始数据
    result = image.copy()
    # 获取图像的高(h)和宽(w)
    h, w = image.shape[:2]
    
    # 生成n个噪声点
    for i in range(n):
        # 随机生成噪声点的坐标(x为行,y为列)
        x = np.random.randint(0, h)
        y = np.random.randint(0, w)
        # 随机决定是椒噪声(0)还是盐噪声(255)
        if np.random.randint(0, 2) == 0:
            result[x, y] = 0  # 椒噪声(黑色)
        else:
            result[x, y] = 255  # 盐噪声(白色)
    return result
  • image.copy():必须复制原图像,否则会直接修改原始帧数据

  • np.random.randint(0, h):生成 0 到 h-1 的随机整数,确保坐标在图像范围内

  • 随机选择 0/1 决定噪声类型,保证椒盐噪声随机分布。

2.2 视频处理主逻辑

python 复制代码
# 打开视频文件(替换为你的视频路径,或用0调用摄像头)
video_capture = cv2.VideoCapture("test.avi")  

# 检查视频是否成功打开
if not video_capture.isOpened():
    print("无法打开视频文件/摄像头")
    exit()

# 循环读取视频帧
while True:
    # 逐帧读取:ret为布尔值(是否读取成功),frame为当前帧图像
    ret, frame = video_capture.read()
    # 若读取失败(如视频结束),退出循环
    if not ret:
        break
    
    # 1. 显示原始帧
    cv2.imshow('Original Video', frame)
    
    # 2. 为当前帧添加椒盐噪声
    noise_frame = add_peppersalt_noise(frame)
    cv2.imshow('Video with Peppersalt Noise', noise_frame)
    
    # 3. 中值滤波去噪(核大小为3×3,需为奇数)
    denoised_frame = cv2.medianBlur(noise_frame, 3)
    cv2.imshow('Denoised Video (Median Blur)', denoised_frame)

    # 按下ESC键(ASCII码27)退出循环
    if cv2.waitKey(20) == 27:
        break

# 释放视频捕获资源
video_capture.release()
# 关闭所有OpenCV窗口
cv2.destroyAllWindows()
  • cv2.VideoCapture:参数为视频路径时读取本地视频,为 0 时调用电脑摄像头

  • cv2.waitKey(20):控制视频播放帧率(20ms / 帧),同时监听键盘输入

  • cv2.medianBlur(noise_frame, 3):3 为滤波核大小,核越大去噪效果越强,但图像会越模糊,可根据需求调整为 5、7 等奇数。

相关推荐
触底反弹4 小时前
🔥 前端也能玩转 AI 流式输出!从二进制流到打字机效果,一篇讲透
javascript·人工智能·node.js
腾渊信息科技公司4 小时前
工业数据运维痛点根治方案:基于AI Agent的产线自动化台账系统落地
运维·人工智能·自动化·个人开发·ai编程
西安老张(AIGC&ComfyUI)4 小时前
第030章:ComfyUI视频制作LTX-2.3模型文生视频工作流详解(三)
人工智能·aigc·comfyui
苦猿的大模型日记5 小时前
Day25 | 模型量化横评 GPTQ vs AWQ vs GGUF vs INT8——同一个 Qwen3-8B 压四遍,谁还活着
人工智能
benchmark_cc5 小时前
如何用 Python + QuantDash 快速构建高胜率“配对交易(Pairs Trading)”策略?
开发语言·人工智能·python·pandas·量化交易·quantdash
深海鱼肝油ya5 小时前
小说自动生成系统(二)
人工智能·大模型·agent·智能体·自动化编程·小说生成系统
通问AI5 小时前
Apple Intelligence 国行备案深度技术解析:阿里千问如何被集成到苹果端侧AI架构
人工智能·架构
视***间6 小时前
算力赋能零售与创意新生态:视程空间Pandora,解锁线下场景智能化无限可能
人工智能·边缘计算·智慧零售·ai算力·视程空间·创意开发
冬奇Lab6 小时前
MCP 系列(08):企业治理——Registry、路由与可观测性
人工智能·llm·mcp
冬奇Lab6 小时前
每日一个开源项目(第161篇):Open Interpreter - 开源 AI 编程 Agent,用 Rust 重写,支持 Kimi、Qwen、DeepSeek
人工智能·开源·资讯