当前位置: 首页 > news >正文

OpenCV对椒盐处理后的视频进行均值滤波处理

代码实现:

import cv2
import numpy as np
sp = cv2.VideoCapture('test.avi')
def add_peppersalt_noise(frame,n=10000):result = frame.copy()h,w= frame.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]=0else:result[x,y]= 255return result
if not sp.isOpened():print('无法打开视频文件')exit()
while True:ret,frame = sp.read() # ret 布尔值 判断是否读到视频帧 frame是读到的帧if not ret:breakframe = cv2.resize(frame, (540, 380))cv2.imshow('video',frame)noise = add_peppersalt_noise(frame)medianB = cv2.medianBlur(noise, 3)cv2.imshow('noise',noise)cv2.imshow('medianBlur',medianB)if cv2.waitKey(1) == 27:break
sp.release()
cv2.destroyAllWindows()

代码解释:

这段代码实现了对视频添加椒盐噪声椒盐噪声(salt-and-pepper noise)并使用中值滤波进行去噪处理的功能,主要分为视频读取、噪声添加、去噪处理和结果显示四个部分。以下是详细解释:

1. 导入库

import cv2  # OpenCV库,用于视频处理和图像处理
import numpy as np  # NumPy库,用于生成随机数和数组操作

2. 打开视频文件

sp = cv2.VideoCapture('test.avi')  # 创建视频捕获对象,读取本地视频文件'test.avi'

cv2.VideoCapture 用于打开视频文件或摄像头,这里传入视频路径表示读取本地文件。

3. 定义添加椒盐噪声的函数

def add_peppersalt_noise(frame, n=10000):result = frame.copy()  # 复制原始帧,避免修改原图h, w = frame.shape[:2]  # 获取图像的高度(h)和宽度(w)for i in range(n):  # 循环n次,添加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  # 像素值设为0(黑色)else:  # 50%概率生成"盐噪声"(白色点)result[x, y] = 255  # 像素值设为255(白色)return result  # 返回添加噪声后的图像

​​​​​​​椒盐噪声:图像中随机出现的黑色点(椒噪声,值为 0)和白色点(盐噪声,值为 255),模拟图像传感器干扰或传输错误。

参数 n 控制噪声数量(默认 10000 个),值越大噪声越密集。

4. 检查视频是否打开成功

if not sp.isOpened():print('无法打开视频文件')exit()  # 打开失败则退出程序

​​​​​​​isOpened() 用于判断视频是否成功打开(路径错误、文件损坏等会导致失败)。

5. 循环处理视频帧

while True:ret, frame = sp.read()  # 读取一帧视频# ret:布尔值,True表示读取成功;frame:当前帧的图像数组(numpy数组)if not ret:break  # 读取失败或视频结束,退出循环# 调整帧大小(可选,便于显示)frame = cv2.resize(frame, (540, 380))  # 缩放到宽540、高380像素# 显示原始视频帧cv2.imshow('video', frame)# 对当前帧添加椒盐噪声noise = add_peppersalt_noise(frame)cv2.imshow('noise', noise)  # 显示带噪声的帧# 对噪声帧进行中值滤波去噪medianB = cv2.medianBlur(noise, 3)  # 3×3卷积核的中值滤波cv2.imshow('medianBlur', medianB)  # 显示去噪后的帧# 按ESC键(ASCII码27)退出循环if cv2.waitKey(1) == 27:break

中值滤波cv2.medianBlur):对椒盐噪声去噪效果极佳,原理是用邻域内像素的中值替换中心像素,能有效去除极端值(黑白噪声点)。

cv2.waitKey(1):等待 1 毫秒,同时检测按键,确保窗口刷新和交互。

6. 释放资源

sp.release()  # 释放视频捕获对象
cv2.destroyAllWindows()  # 关闭所有显示窗口

必须在程序结束时释放资源,避免内存泄漏。

整体效果

运行后会显示三个窗口:

video:原始视频帧

noise:添加椒盐噪声后的视频帧(可见大量黑白斑点)

medianBlur:中值滤波处理后的视频帧(噪声明显减少,图像较清晰)

通过对比可以直观看到中值滤波对椒盐噪声的去除效果。如果噪声更严重,可增大 add_peppersalt_noise 中的 n 值,或调整 medianBlur 的卷积核大小(如 5,需为奇数)。

输出结果:

​​​​​​​

http://www.dtcms.com/a/331059.html

相关文章:

  • Opencv 边界填充 图像运算 阈值处理 和图像平滑处理
  • 文件上传接口接收不到文件入参
  • 题解:P4777 【模板】扩展中国剩余定理(EXCRT)
  • Qt项目查找依赖库打包
  • IDEA、Pycharm、DataGrip等激活破解冲突问题解决方案之一
  • Springboot项目重启后Session依旧存在
  • Python包性能优化与并发编程:构建高性能应用的核心技术(续)
  • 轻量级开源全文搜索引擎:Manticore Search 入门介绍
  • C++基础(①入门教程)
  • 本地jar导入到本地仓科和远程仓库
  • Maven学习笔记
  • 92、23种设计模式-单例模式
  • 项目日志框架与jar中日志框架冲突 解决
  • 《多级缓存架构设计与实现全解析》
  • 自动化测试|持续集成Git使用详解
  • label studio 服务器端打开+xshell端口转发设置
  • 01数据结构-最短路径Dijkstra
  • 【数据结构入门】
  • 移动机器人底盘在高校科研中的AI智能教育应用
  • (第十五期)HTML文本格式化标签详解:让文字更有表现力
  • Flutter GetX 全面指南:状态管理、路由与依赖注入的最佳实践
  • SpringMVC请求与响应
  • 三坐标测量仪:从机械精密到智能协同的技术
  • flutter 开发 鸿蒙 App
  • gitee_配置自动部署vue项目
  • Uniapp 获取系统信息:uni.getSystemInfo 与 uni.getSystemInfoSync
  • vs2022 opencv环境配置(使用相对地址-将依赖都放入项目中)
  • spring boot配置es
  • 开发避坑指南(26):Vue3 input输入框前置后 置元素解决方案
  • 新增和编辑共用弹窗模板