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

实战项目实现以下功能:

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

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

  • 实现方式

    • 读取视频的每一帧。

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

    • 输出带噪声的视频帧。


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

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

  • 可选方法(推荐):

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

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

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

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


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

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

    1. 原视频窗口

    2. 加噪视频窗口

    3. 去噪后视频窗口

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

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

项目完整代码:

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] = 0else:result[x, y] = 255return 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. 导入库
import cv2
import numpy as np
  • cv2:OpenCV库,用于视频处理、图像滤波等操作
  • numpy:用于数值计算,支持高效的数组操作

2. 添加椒盐噪声函数
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. 视频读取与初始化
cap = cv2.VideoCapture('picture/test.avi')
if not cap.isOpened():print("无法打开视频文件,请检查路径!")exit()
  • 功能:打开指定路径的视频文件(需确保路径正确)
  • 关键点
    • 使用 cv2.VideoCapture 加载视频
    • 检查视频是否成功打开(cap.isOpened()

4. 逐帧处理逻辑
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. 资源释放
cap.release()
cv2.destroyAllWindows()
  • 功能:释放视频资源并关闭所有OpenCV窗口

关键知识点总结

  1. 椒盐噪声模拟:通过随机位置设置黑白像素点实现
  2. 中值滤波优势:对椒盐噪声效果显著,能保留边缘信息
  3. 参数选择:中值滤波核大小为3×3,适用于多数场景;若噪声密集可尝试更大核(如5×5)
  4. 性能优化:大规模噪声生成时,可改用向量化操作(如 np.random.choice)提高效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96298.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day42 PHP(mysql注入、跨库读取)

一、sql注入基本原理:没有对用户输入的数据进行限制,导致数据库语句可以做什么,用户就可以做什么。取决于不同数据库的不同查询语言,所以为什么有mysql注入/orcale注入等等。步骤:【access】表名(字典爆破来…

机器人控制器开发(部署——软件打包备份更新)

文章总览 为什么做备份更新 为机器人控制器设计一套打包备份更新机制,为控制器的批量生产和产品与项目落地做准备。 当某个模块出现bug需要升级时,用户可以快速获取正确的bak包并导入到控制器中重启生效。 如果没有做好软件的备份更新机制&#xff0c…

LaTeX TeX Live 安装与 CTAN 国内镜像配置(Windows / macOS / Linux 全流程)

这是一份面向国内环境的 LaTeX 从零到可编译 指南:覆盖 TeX Live / MacTeX 安装、PATH 配置、CTAN 国内镜像(清华/北外/上交/中科大等)一键切换与回滚、常见坑位(权限、镜像路径、版本切换)、以及 XeLaTeX/latexmk 的实…

WhoisXML API再次荣登2025年美国Inc. 5000快速成长企业榜单

WhoisXML API非常自豪地宣布,我们再次荣登美国权威榜单——2025年Inc.5000全美成长最快的私营企业之一。今年,公司在地区排名中位列第119名,在全美总体排名中位列第4,271名。Inc. 5000榜单要求参评企业必须保持独立运营,并在2021至…

Elasticsearch面试精讲 Day 9:复合查询与过滤器优化

【Elasticsearch面试精讲 Day 9】复合查询与过滤器优化 在Elasticsearch的搜索体系中,复合查询(Compound Queries)与过滤器(Filters)优化是构建高效、精准搜索逻辑的核心能力。作为“Elasticsearch面试精讲”系列的第…

Android使用ReactiveNetwork监听网络连通性

引入库 implementation com.github.pwittchen:reactivenetwork-rx2:3.0.8监听网络连接变更ReactiveNetwork.observeNetworkConnectivity(context).subscribeOn(Schedulers.io())// ... // anything else what you can do with RxJava.observeOn(Schedulers.computation()).subs…

基于阿里云部署 RustDesk 自托管服务器

基于阿里云部署 RustDesk 自托管服务器一、背景与需求场景二、什么是 RustDesk?为什么选择自托管?2.1 RustDesk 是什么?2.2 为什么选择自托管?三、环境准备与架构说明四、操作步骤4.1 在阿里云上安装 RustDesk 服务端4.1.1 下载并…

细说分布式ID

针对高并发写,分布式ID是其业务基础,本文从一个面试题细细展开。面试官:1.对于Mysql的InnoDB引擎下,自增ID和UUID作为主键各自有什么优劣,对于一张表的主键你建议使用哪种ID?2.除了UUID是否还了解其他类型的…

2025年大数据专业证书报考指南:专科学历必看的8大选择​

对于大专学历的同学来说,2025年进入大数据行业是一个充满机遇的选择。大数据领域发展迅速,各类证书能够帮助求职者提升专业能力、增强就业竞争力。其中最推荐的是CDA数据分析师,这个证书适应了未来数字化经济和AI发展趋势,难度不高…

Python爬虫实战:研究Axis Artist模块,构建电商数据采集和分析系统

1. 引言 1.1 研究背景与意义 在大数据时代,互联网上蕴藏着海量有价值的信息,这些信息涵盖了社会、经济、科技等各个领域。高效地从互联网获取数据并进行深度分析,对于企业决策、学术研究、市场分析等都具有重要意义。Python 作为一种功能强大的编程语言,凭借其丰富的库支…

突破大语言模型推理瓶颈:深度解析依赖关系与优化策略

突破大语言模型推理瓶颈:深度解析依赖关系与优化策略当ChatGPT需要5秒才能生成一个回答,当企业级大模型每秒只能处理3个用户请求——这些性能瓶颈的背后,隐藏着大语言模型推理计算中复杂的依赖关系网。在大语言模型推理过程中,依赖…

整理了几道前端面试题

1. 若是有两个数组ar1和ar2,求它们的并集和交集,要怎么做? const ar1 [1, 2, 3, 4]; const ar2 [3, 4, 5, 6];一、求并集 (Union) 目标: 把两个数组合并成一个新数组,新数组包含所有出现过的元素,但每个…

Mac M4环境下基于VMware Fusion虚拟机安装Ubuntu24.04 LTS ARM版

Mac M4环境下基于VMware Fusion虚拟机安装Ubuntu24.04 LTS ARM版 1 下载Ubuntu镜像 在Ubuntu官网下载Ubuntu24.04 LTS的arm版镜像,这里选择ubuntu-24.04-live-server-arm64.iso,支持arm的似乎没有合适的desktop版本,Server版本默认是不带图…

开源与定制化对比:哪种在线教育系统源码更适合教育培训APP开发?

如今,“在线教育系统源码”已经成为许多教育培训机构、创业者甚至传统学校的高频关键词。无论是打造一款在线教育APP,还是开发企业内部培训平台,源码选择都决定了后续的开发效率、产品体验与商业化潜力。 在实际开发中,常见的源码…

中间件的日志分析

将日志文件access.log复制到kali中进行分析使用命令查看文件中各IP的访问次数,依次分析其行为awk { print $1 } access.log | sort | uniq -c |sort -nr172.16.3.189cat access.log | grep 172.16.3.198行为模式分析使用固定弱密码进行身份验证 几乎所有请求都使用用…

【Big Data】云原生与AI时代的存储基石 Apache Ozone 的技术演进路径

目录 一、Apache Ozone是什么? 二、Ozone的诞生背景 三、Ozone的架构设计 1. 分层架构设计 2. Ozone Manager (OM) 3. Storage Container Manager (SCM) 4. DataNode 5. Raft协议应用 四、Ozone解决的关键问题 1. 元数据管理瓶颈 2. 小文件性能问题 3. …

抖音直播礼物弹幕抓取工具:技术实现与功能解析

基于Python的直播间数据采集技术实践一、项目概述基于Python开发的直播间数据采集方案,采用最新签名算法(dysign)实现稳定连接,实时获取直播间各类互动数据,为直播数据分析和互动应用开发提供技术支持。二、核心功能实时消息监控用户进入提醒…

添加地址页面,可以添加复制粘贴,自动识别地址的功能uniapp实现方式

主要用uni.getClipboardData(OBJECT),更多信息可以到uniapp官网查看以下实现方式 1利用api, 2针对判断优化方案,在线APIhandleConfirm2(){let that this;promisRequest({url: https://wangzc.wang/smAddress,data: {"address": that.…

ESP32 驱动 PWM 舵机为什么必须共地?——从原理到实践全解析

在使用 ESP32 控制 PWM 舵机 的过程中,新手经常遇到一个常见问题:舵机不动、乱动、甚至烧坏芯片。 其中最典型的原因,就是没有正确共地。 很多初学者会疑惑:“外接电池只是给舵机供电,为什么还要把电池的地线接到 ESP32 的 GND 上呢?” 本文将从 信号逻辑、闭合回路、…

细菌基因组genome二代测序数据分析

kraken2去除污染conda create -n kraken2 conda activate kraken2 conda install kraken2 -c bioconda mkdir kraken2_outputkraken2 --db ../../kraken2_db/k2_pluspf_20250402/ --threads 8 --paired 250811_HS67EV0804_R1.fastq.gz 250811_HS67EV0804_R2.fastq.gz --use-nam…