实战项目-----Python+OpenCV 实现对视频的椒盐噪声注入与实时平滑还原”

实战项目实现以下功能:

功能 1:为视频每一帧添加椒盐噪声

  • 作用:模拟真实环境中图像传输或采集时可能出现的噪声。

  • 实现方式:

    • 读取视频的每一帧。

    • 随机选择 10000 个像素点,将其设置为黑色(0)或白色(255),生成"椒盐"效果。

    • 输出带噪声的视频帧。


功能 2:对含噪视频帧进行图像平滑处理(去噪)

  • 目标:去除噪声的同时,尽可能保留原图像细节。

  • 可选方法(推荐):

    • 中值滤波(Median Filter):对椒盐噪声特别有效,能去除黑白噪点而不模糊边缘。

    • 高斯滤波(Gaussian Blur):适合轻度噪声,但可能轻微模糊图像。

    • 双边滤波(Bilateral Filter):在去噪的同时保留边缘细节,效果较好但计算量大。

  • 建议 :优先使用 中值滤波 (cv2.medianBlur()),因为它对椒盐噪声效果最好。


功能 3:同时显示三个视频窗口

  • 使用 OpenCV 的 cv2.imshow() 创建三个窗口:

    1. 原视频窗口

    2. 加噪视频窗口

    3. 去噪后视频窗口

  • 实时播放,逐帧对比效果。

  • 按任意键(如 q)退出播放。

项目完整代码:

python 复制代码
import cv2
import numpy as np

# 1. 添加椒盐噪声函数(复用)
def add_peppersalt_noise(image, n=10000):
    result = image.copy()
    h, w = image.shape[:2]
    for i in range(n):
        x = np.random.randint(1, h)
        y = np.random.randint(1, w)
        if np.random.randint(0, 2) == 0:
            result[x, y] = 0
        else:
            result[x, y] = 255
    return result

# 2. 打开视频文件
cap = cv2.VideoCapture('picture/test.avi')

# 检查视频是否成功打开
if not cap.isOpened():
    print("无法打开视频文件,请检查路径!")
    exit()

# 3. 逐帧处理
while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 添加噪声
    noisy_frame = add_peppersalt_noise(frame, 10000)

    # 中值滤波去噪(保留边缘,适合椒盐噪声)
    denoised_frame = cv2.medianBlur(noisy_frame, 3)

    # 显示三个窗口
    cv2.imshow('Original Video', frame)
    cv2.imshow('Noisy Video', noisy_frame)
    cv2.imshow('Denoised Video', denoised_frame)

    # 按 'q' 键退出
    if cv2.waitKey(30) & 0xFF == ord('q'):
        break

# 4. 释放资源
cap.release()
cv2.destroyAllWindows()
1. 导入库
python 复制代码
import cv2
import numpy as np
  • cv2:OpenCV库,用于视频处理、图像滤波等操作
  • numpy:用于数值计算,支持高效的数组操作

2. 添加椒盐噪声函数
python 复制代码
def add_peppersalt_noise(image, n=10000):
    result = image.copy()
    h, w = image.shape[:2]
    for i in range(n):
        x = np.random.randint(1, h)  # x坐标范围:[1, h-1](避免边缘)
        y = np.random.randint(1, w)  # y坐标范围:[1, w-1](避免边缘)
        if np.random.randint(0, 2) == 0:  # 50%概率选择黑白点
            result[x, y] = 0             # 黑色噪声点(椒盐噪声)
        else:
            result[x, y] = 255            # 白色噪声点
    return result
  • 功能:在输入图像上随机添加黑白像素点模拟椒盐噪声
  • 参数 :n表示噪声点数量(默认10000个)
  • 实现细节 :
    • 通过循环生成随机坐标 (x, y)
    • 使用 np.random.randint 决定该位置是黑色(0)还是白色(255)
    • 仅修改非边缘像素(避免边界被过度干扰)

3. 视频读取与初始化
python 复制代码
cap = cv2.VideoCapture('picture/test.avi')
if not cap.isOpened():
    print("无法打开视频文件,请检查路径!")
    exit()
  • 功能:打开指定路径的视频文件(需确保路径正确)
  • 关键点 :
    • 使用 cv2.VideoCapture 加载视频
    • 检查视频是否成功打开(cap.isOpened())

4. 逐帧处理逻辑
python 复制代码
while True:
    ret, frame = cap.read()
    if not ret:  # 视频读取结束
        break

    # 添加噪声
    noisy_frame = add_peppersalt_noise(frame, 10000)

    # 中值滤波去噪(3x3窗口)
    denoised_frame = cv2.medianBlur(noisy_frame, 3)

    # 显示三窗口对比
    cv2.imshow('Original Video', frame)
    cv2.imshow('Noisy Video', noisy_frame)
    cv2.imshow('Denoised Video', denoised_frame)

    if cv2.waitKey(30) & 0xFF == ord('q'):  # 按 'q' 退出
        break
  • 逐帧处理 :
    • 通过 cap.read() 读取视频的每一帧(frame)
    • 若读取失败(ret=False),则退出循环
  • 添加噪声 :调用 add_peppersalt_noise 函数生成含噪声的帧(noisy_frame)
  • 中值滤波 :使用 cv2.medianBlur(..., 3) 对噪声帧进行去噪(3×3窗口)
    • 原理:将窗口内像素排序后取中间值,保留边缘细节的同时过滤极端值(0或255)
  • 显示结果 :
    • 同时展示原始帧、噪声帧和去噪帧(通过 cv2.imshow)
    • 按 q 键触发 break 退出循环

5. 资源释放
python 复制代码
cap.release()
cv2.destroyAllWindows()
  • 功能:释放视频资源并关闭所有OpenCV窗口

关键知识点总结

  1. 椒盐噪声模拟:通过随机位置设置黑白像素点实现
  2. 中值滤波优势:对椒盐噪声效果显著,能保留边缘信息
  3. 参数选择:中值滤波核大小为3×3,适用于多数场景;若噪声密集可尝试更大核(如5×5)
  4. 性能优化 :大规模噪声生成时,可改用向量化操作(如 np.random.choice)提高效率
相关推荐
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
AI的探索之旅3 天前
97 个 OpenCV 实例(三十):双目立体,从标定到点云
人工智能·opencv·计算机视觉
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
长沙三为智能科技3 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时3 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++