(一)在pycharm软件中,用python语言,opencv库实现以下功能

(1.1)图片的边界填充

核心流程:
  1. 读取原始图像
    使用 cv2.imread() 加载名为 yueshan.png 的图像文件

  2. 统一边界参数
    设定四周留白尺寸均为 50px(上下左右各50像素)

  3. 五种边界填充模式实验
    对同一原始图像执行以下操作,生成带不同特性边框的新图像:

    •  BORDER_CONSTANT: 用固定值 (22,25,8)(蓝绿色)填充边界
    •  BORDER_REFLECT: 镜像翻转相邻像素内容作为边界
    •  BORDER_REFLECT101: 奇偶对称的特殊镜像模式
    •  BORDER_REPLICATE: 直接复制边缘像素平铺边界
    •  BORDER_WRAP: 将图像视为周期信号循环延伸
  4. 可视化对比
    通过 cv2.imshow() 分窗口显示原始图像及五种边界处理结果,按任意键逐幅查看

示例代码:
# cv2.copyMakeBorder()是opencV库中的一个函数,用于给图像添加额外的边界(padding)
# copyMakeBorder(src: umat, top: int, bottom: int, left: int, right: int, borderType: int, dst: umat /None = ... valve: cv2.typing.scalar = ...)
# 它有以下几个参数:
# src:要扩充边界的原始图像。
# top,bottom,left,right:相应方向上的边宽度。
# borderType:定义要添加边框的类型,它可以是以下的一种:
# CV2.BORDER_CONSTANT:添加的边界框像素值为常数(需要额外再给定一个参数)。
# CV2.BORDER_REFLECT:添加的边框像素将是边界元素的镜面反射,类似于gfedchalabcdefgh|hgfedcba。(交界处也复制了)
# CV2.BORDER_REFLECT_101 或 CV2.BORDER_DEFAULT;和上面类似,但是有一些细微的不同,类似于gfedcblabcdefghlgfedcba (交接处删除了)
# CV2.BORDER_REPLICATE:使用最边界的像素值代替,类似于aaaaaalabcdefghlhhhhhhh# CV2.BORDER_WRAP:上下左右边依次替换,cdefghlabcdefghlabcdefgimport cv2ys = cv2.imread('yueshan.png')
# ys = cv2.resize(ys, dsize=None, fx=0.5, fy=0.5)  # 图片缩放
# ys = cv2.resize(ys, (640, 480))top, bottom, left, right = 50, 50, 50, 50constant = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_CONSTANT, value=(22, 25, 8))
reflect = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_WRAP)cv2.imshow('yuantu', ys)
cv2.waitKey(0)cv2.imshow('CONSTANT', constant)
cv2.waitKey(0)cv2.imshow('REFLECT', reflect)
cv2.waitKey(0)cv2.imshow('REFLECT_101', reflect101)
cv2.waitKey(0)cv2.imshow('REPLICATE', replicate)
cv2.waitKey(0)cv2.imshow('WRAP', wrap)
cv2.waitKey(0)

ys:

constant:

reflect:

reflect101:

replicate:

wrap:

(1.2)图片的图像运算

核心功能:
  1.  基础加减法:直接对像素值进行数学运算(如全局加10)
  2.  区域叠加:通过切片操作实现特定区域的图像相加
  3.  安全加法cv2.add() 自动处理像素溢出(超过255则置为255)
  4.  加权融合cv2.addWeighted() 按比例混合两张图像并添加亮度偏移
示例代码:
# 图像加法运算
# 对于“+”号运算,当对图像a、图像b进行加法求和时,遵循以下规则:
#   当某位置像素相加得到的数值小于255时,该位置数值为两图像该位置像素相加之和;
#   当某位置像素相加得到的数值大于255时,该位置数值将截断结果并将其减去256。
#   例如:相加后是260,实际是260-256=4
import cv2
a = cv2.imread('mimi.jpg')
b = cv2.imread('mimi1.jpg')
c = a + 10                    # 图像整体加10
cv2.imshow('yuantu', a)
cv2.imshow('a+10', c)
cv2.waitKey(0)# ROI 区域相加示例
c = a[50:450, 50:400] + b[50:450, 50:400]
cv2.imshow('a+b', c)
cv2.waitKey(0)# 对于 cv2.add 运算,当对图像a、图像b进行加法求和时,遵循以下规则:
#   当某位置像素相加得到的数值小于255时,该位置数值为两图像该位置像素相加之和;
#   当某位置像素相加得到的数值大于255时,该位置数值为255(饱和运算)。a = cv2.imread('mimi.jpg')
b = cv2.imread('mimi1.jpg')
b = cv2.resize(b, dsize=(400, 400))
a = cv2.resize(a, dsize=(400, 400))
c = cv2.add(a, b)
cv2.imshow('a add b', c)
cv2.waitKey(0)
cv2.destroyAllWindows()# 图像加权运算
# 在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,公式为:
#   dst = src1 × α + src2 × β + γa = cv2.imread('mimi.jpg')
b = cv2.imread('mimi1.jpg')
b = cv2.resize(b, dsize=(400, 400))
a = cv2.resize(a, dsize=(400, 400))c = cv2.addWeighted(a,0.5,b,0.5,10)  # γ=10 为亮度偏移
cv2.imshow('addWeighted', c)
cv2.waitKey(0)
cv2.destroyAllWindows()

yuantu :

a+10:

a+b:

a add b:

addWeighted:

(1.3)图片的阈值处理

核心功能:
1.读入灰度图
image = cv2.imread('mimi1.jpg', cv2.IMREAD_GRAYSCALE)  # 读入灰度图

作用:加载一张只有亮度信息的灰度照片(像素值范围0~255)
相当于:把彩色照片去掉颜色,只留下明暗层次

2.阈值处理类型对照表

所有方法共用同一组参数:threshold=175maxval=255
(即:"以175为分界线,最高允许到255")

方法名称英文标识行为规则效果图特征
标准二值化cv2.THRESH_BINARY ≥175 → 纯白(255)
<175 → 纯黑(0)
黑白分明,像木刻版画
反向二值化cv2.THRESH_BINARY_INV ≥175 → 纯黑(0)
<175 → 纯白(255)
阴阳颠倒,亮处变暗,暗处变亮
截断处理cv2.THRESH_TRUNC ≥175 → 强制设为175
<175 → 保持原样
过曝区域集体降亮度,画面偏灰蒙蒙
低区归零cv2.THRESH_TOZERO ≥175 → 保持原样
<175 → 强制设为0(纯黑)
暗部全黑,亮部保留渐变
高区归零cv2.THRESH_TOZERO_INV <175 → 保持原样
≥175 → 强制设为0(纯黑)
亮部全黑,暗部保留渐变
示例代码:
#阈值处理
import cv2# 读取灰度图
image = cv2.imread('mimi1.jpg', cv2.IMREAD_GRAYSCALE)# 阈值处理
ret, binary      = cv2.threshold(image, 175, 255, cv2.THRESH_BINARY)
ret1, binaryinv  = cv2.threshold(image, 175, 255, cv2.THRESH_BINARY_INV)
ret2, trunc      = cv2.threshold(image, 175, 255, cv2.THRESH_TRUNC)
ret3, tozero     = cv2.threshold(image, 175, 255, cv2.THRESH_TOZERO)
ret4, tozeroinv  = cv2.threshold(image, 175, 255, cv2.THRESH_TOZERO_INV)# 显示结果
cv2.imshow('gray', image)
cv2.waitKey(0)cv2.imshow('binary', binary)        # 偏白的变纯白,偏黑的变纯黑
cv2.waitKey(0)cv2.imshow('binaryinv', binaryinv)  # 偏白的变纯黑,偏黑的变纯白
cv2.waitKey(0)cv2.imshow('trunc', trunc)          # 白色变得一样灰蒙蒙,偏黑的不变
cv2.waitKey(0)cv2.imshow('tozero', tozero)        # 偏白色不变,偏黑的就变纯黑
cv2.waitKey(0)cv2.imshow('tozeroinv', tozeroinv)  # 偏白色变纯黑,偏黑的不变
cv2.waitKey(0)cv2.destroyAllWindows()

gray:

binary:

binaryinv:

trunc:

tozero:

tozeroinv:

(1.4)图片的图像平滑处理

关键函数总结:
滤波方法函数名关键参数特点
均值滤波cv2.blur(src, ksize)简单平均,模糊均匀
方框滤波cv2.boxFilter(src, ddepth, ksize, normalize)可控制是否归一化
高斯滤波cv2.GaussianBlur(src, ksize, sigmaX)保留边缘,模糊更自然
中值滤波cv2.medianBlur(src, ksize)去噪强,保留边缘
示例代码:
import cv2
import numpy as npdef 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# 读取并显示原图
image = cv2.imread('zl.png')
cv2.imshow('yntu', image)
cv2.waitKey(0)# 添加噪声并显示
noise = add_peppersalt_noise(image)
cv2.imshow('noise', noise)
cv2.waitKey(0)
# 3x3核(轻度模糊)
blur_1 = cv2.blur(noise, (3, 3))
cv2.imshow('blur_1', blur_1)
cv2.waitKey(0)# 63x63核(重度模糊)
blur_2 = cv2.blur(noise, (63, 63))
cv2.imshow('blur_2', blur_2)
cv2.waitKey(0)# 归一化(效果同均值滤波)
boxFilter_1 = cv2.boxFilter(noise, -1, (3, 3), normalize=True)
cv2.imshow('boxFilter_1', boxFilter_1)
cv2.waitKey(0)# 不归一化(像素值可能溢出为255)
boxFilter_2 = cv2.boxFilter(noise, -1, (3, 3), normalize=False)
cv2.imshow('boxFilter_2', boxFilter_2)
cv2.waitKey(0)# 高斯滤波:3x3核,sigmaX=1
GaussianB = cv2.GaussianBlur(noise, (3, 3), sigmaX=1)
cv2.imshow('GaussianBlur', GaussianB)
cv2.waitKey(0)# 中值滤波:3x3核
medianB = cv2.medianBlur(noise, 3)
cv2.imshow('medianBlur', medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()

yutu:

noise:

blur_1:

blur_2:

boxFilter_1:

boxFilter_2:

GaussianBlur:

medianBlur:

(二)实战项目案例

项目内容:

核心步骤和功能:

1. 打开视频流 
   cap = cv2.VideoCapture('test.avi')  
→ 把硬盘里的视频文件变成一帧一帧的图像流,供后续逐帧处理

2. 逐帧读取  
 ret, frame = cap.read()  
→ 每次循环拿到一帧原始图像(BGR 格式)

3. 加椒盐噪声  
 noisy = add_peppersalt_noise(frame, 10000)  
→ 在这帧上随机撒 10000 个黑白点,模拟真实噪声

4. 去噪处理
   denoised = cv2.medianBlur(noisy, 3) 
→ 用 3×3 中值滤波去掉椒盐噪声,同时尽量保留画面细节

5.三窗口同步显示 
 - cv2.imshow('Original Video', frame) 
- cv2.imshow('Noisy Video', noisy)  
- cv2.imshow('Denoised Video', denoised)  
→ 实时对比“原图 / 有噪图 / 去噪图”

6. 按 q 退出 
   if cv2.waitKey(30) & 0xFF == ord('q'): break  
→ 用户随时按 q 键即可结束播放

7. 资源释放 
   cap.release(); cv2.destroyAllWindows()
→ 关闭摄像头或文件句柄,释放内存,销毁所有窗口

代码实现和效果:

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('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()

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

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

相关文章

HTTP协议-3-HTTP/2是如何维持长连接的?

先说结论&#xff1a;HTTP/2的“长连接” 一个TCP连接 多路复用 二进制帧 流控制 持久会话管理 它不只是“连接不断”&#xff0c;更关键的是&#xff1a;在这个长连接上&#xff0c;可以同时并发传输成百上千个请求和响应&#xff0c;互不阻塞&#xff01; 1、HTTP/2的“…

图解希尔排序C语言实现

1 希尔排序 希尔排序&#xff08;Shell Sort&#xff09;是D.L.Shell于1959年提出来的一种排序算法&#xff0c;在这之前排序算法的时间复杂度基本都是O(n)&#xff0c;希尔排序算法是突破这个时间复杂度的第一批算法之一。 1.1 基本概念与原理 希尔排序通过将原始列表分割成若…

网络协议——HTTPS协议

目录 一、HTTPS是什么 加密是什么 二、HTTPS的工作过程 &#xff08;一&#xff09;对称加密 &#xff08;二&#xff09;非对称加密 &#xff08;三&#xff09;在非对称加密的基础上&#xff0c;引入证书校验 证书是什么 证书的内容 用证书解决中间人攻击 三、总结 …

React 基础实战:从组件到案例全解析

React 基础实战专栏:从组件到案例全解析 本专栏围绕 React 核心概念(组件、Props、State、生命周期)展开,通过 6个实战案例+核心知识点拆解,帮你掌握 React 基础开发逻辑,每篇聚焦1个实战场景,搭配完整代码与原理讲解,适合 React 入门者巩固基础。 专栏目录 【组件传…

ARM芯片架构之CoreSight Channel Interface 介绍

CoreSight Channel Interface&#xff08;通道接口&#xff09;详解1. 概述 Channel Interface 是 ARM CoreSight 架构中用于在不同组件之间传递触发事件的专用接口。它是 Event Interface 的增强版本&#xff0c;支持多通道、双向通信&#xff0c;以及同步与异步两种时钟域连接…

Blender模拟结构光3D Scanner(二)投影仪内参数匹配

关于投影仪外参的设置可参见前一篇文章 Blender模拟结构光3D Scanner&#xff08;一&#xff09;外参数匹配-CSDN博客 使用Projectors插件模拟投影仪 Step 1 在Github下载插件&#xff08;https://github.com/Ocupe/Projectors&#xff09;。下载zip压缩包即可&#xff0c;无…

synchronized的作用

目录 一、核心作用 二、实现原理&#xff1a;基于"对象锁" 三、使用方式 四、锁的优化 五、优缺点 六、总结 synchronized 是 Java 中用于解决多线程并发安全问题的核心关键字&#xff0c;它的主要作用是实现线程间的同步&#xff0c;确保多个线程在访问共享资…

机试备考笔记 14/31

2025年8月14日 小结&#xff1a;&#xff08;17号整理14号的笔记&#xff0c;这辈子真是有了w(&#xff9f;Д&#xff9f;)w&#xff09;昨天摔了跤大的&#xff0c;今天好妈妈在家&#xff0c;松弛。省流&#xff1a;6道中等&#xff0c;明天只学了10分钟嘻嘻 目录LeetCode22…

dolphinscheduler中任务输出变量的问题出现ArrayIndexOutOfBoundsException

一段脚本任务如下&#xff1a;ret/data/dolphinscheduler/loadOraTable.sh "yonbip/yonbip10.16.10.69:1521/orcl" "select t.bondcontractno,t.olcunissuemny from yonbip.bond_contract t " "/dmp/biz" "bip" "2025-08-13"…

OpenCv(二)——边界填充、阈值处理

目录 一、边界填充&#xff08;Border Padding&#xff09; 1. 常见填充类型及效果 2.代码示例 &#xff08;1&#xff09;constant边界填充&#xff0c;填充指定宽度的像素 &#xff08;2&#xff09;REFLECT镜像边界填充 &#xff08;3&#xff09;REFLECT_101镜像边界…

Leetcode 15 java

今天复习一下翻转二叉树 226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2…

嵌入式学习的第四十九天-时钟+EPIT+GPT定时器

一、时钟1.时钟系统基本概念&#xff08;1&#xff09;PLL (锁相环, Phase-Locked Loop)作用&#xff1a;PLL是一种反馈控制电路&#xff0c;用于生成稳定的高频时钟信号。它通过将输出时钟与参考时钟进行比较和调整&#xff0c;可以产生比输入参考时钟频率高得多的输出时钟。倍…

Python Sqlalchemy数据库连接

Python Sqlalchemy数据库连接一、连接数据二、模型三、ORM操作一、连接数据 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker# 1. 连接数据库 dbHost postgres://用户名:密码主机:端口/数据库名 engine create_engine(dbHost) # create_engi…

【Node.js】ECMAScript标准 以及 npm安装

目录 一、 ECMAScript标准 - 默认导出和导入 二、ECMAScript标准 - 命名导出和导入 三、包的概念 五、 npm - 安装所有依赖 六、 npm - 全局软件包 Node.js总结 总结不易~ 本章节对我有很大的收获&#xff0c; 希望对你也是&#xff01;&#xff01;&#xff01; 本节素材…

NPM 、 NPX

NPM vs. NPX 简单来说&#xff0c;npm 是一个 node 包管理器&#xff0c;npx 是一个 Node 包执行器。 NPX 是一个 Node 包执行器&#xff0c;该 Node 包可以是本地也可以是远程的。允许开发者在无需安装的情况下执行任意 Node 包。npm 在安装nodejs 就自动带了 npm install -g …

守护品质安全,防伪溯源系统打造全链路信任体系

一、引言在当下这个信息透明、品质至上的时代&#xff0c;防伪溯源已经成为众多品牌保护自身利益、提升消费者信任度的重要手段。为了满足市场上对高效、可靠的防伪溯源查询系统的迫切需求&#xff0c;榕壹云精心打造了一款防伪溯源查询系统。二、项目背景随着商品市场的不断扩…

【完整源码+数据集+部署教程】无人机航拍视角洪水检测与受灾房屋识别图像分割救援指导系统源码和数据集:改进yolo11-DCNV2

背景意义 研究背景与意义 随着全球气候变化的加剧&#xff0c;极端天气事件的频率和强度不断上升&#xff0c;洪水作为一种常见的自然灾害&#xff0c;给人类社会带来了严重的威胁。洪水不仅导致人员伤亡和财产损失&#xff0c;还对基础设施和生态环境造成了深远的影响。因此&a…

C# 结构体与类的区别是什么?

结构体是值类型是储存在栈中独立储存的,数据与数据之间不会相互影响,即使将一个结构体赋值给另外一个结构体也不会相互影响。 类是一个模板,实例出来的对象是独立的不会相互影响,但是将一个对象赋值给另一个对象时 会把指向堆内存中数据的指针赋值给另一个对象.从而发生两个变量…

Redis GEO

Redis GEO 引言 Redis 是一款高性能的键值存储系统,广泛应用于缓存、消息队列等领域。Redis GEO 是 Redis 2.4 版本后新增的一个功能,用于存储地理位置信息。本文将详细介绍 Redis GEO 的概念、使用方法以及应用场景。 什么是 Redis GEO? Redis GEO 是 Redis 的一个模块…

Go从入门到精通系列学习路线规划

Go从入门到精通系列学习路线规划 目录导航 Go从入门到精通系列学习路线规划首页说明 第1篇_Go语言初探_环境搭建与HelloWorld 第2篇_Go语言基础语法_变量常量与数据类型 第3篇_Go语言控制结构_条件判断与循环 第4篇_Go语言函数详解 第5篇_Go语言数据结构详解 第6篇_Go语言结构体…