学习日记 8.1
前言前一篇文章讲了图片读取与显示今天继续看图像运算、阈值处理和噪声去除。主要涉及图像运算图像的加法运算与加权融合阈值处理二值化、截断等阈值操作以及图像边框的填充噪声去除椒盐噪声的生成与多种滤波器的去噪效果对比一、图像运算1.1 使用 NumPy 的加法 运算符直接用运算符做图像加法但 NumPy 的加法是取模运算import cv2 a1 cv2.imread(3.png) b1 cv2.imread(4.jpg) a1 cv2.resize(a1, (500, 400)) b1 cv2.resize(b1, (500, 400)) NumPy 加法像素值相加后对 256 取模 c1 a1 10 # 每个像素值加 10 c2 a1[50:450, 50:400] b1[50:450, 50:400] # ROI 区域相加当像素值超过 255 时NumPy 会将其对 256 取模。例如250 10 260取模后变成260 % 256 4这会导致原本应该更亮的区域反而变暗出现“溢出回绕”的现象。1.2 使用 OpenCV 的 cv2.add() 函数OpenCV 提供了专门的加法函数cv2.add()它的处理方式是饱和运算——超过 255 的值会被截断为 255a2 cv2.imread(3.png) b2 cv2.imread(4.jpg) b2 cv2.resize(b2, (400, 400)) a2 cv2.resize(a2, (400, 400)) OpenCV 加法超过 255 的像素值会被截断为 255饱和运算 c3 cv2.add(a2, b2)运算方式函数溢出处理NumPy 加法img1 img2取模运算% 256OpenCV 加法cv2.add(img1, img2)饱和运算截断到 255小结在处理图像加法时推荐使用cv2.add()因为它避免了取模操作带来的“反色”异常视觉效果更加自然。1.3 图像加权融合 —— cv2.addWeighted()有时候我们希望将两张图像按照一定比例混合而不是简单地相加。这时候就可以使用cv2.addWeighted()# 参数img1, 权重1, img2, 权重2, 亮度偏移量 c4 cv2.addWeighted(a2, 0.7, b2, 0.3, 100)公式为dst α · img1 β · img2 γ其中 α 和 β 是两幅图像的权重γ 是亮度调节参数。在上面的代码中a2占 70% 的权重b2占 30%最后再加上 100 的亮度偏移。这个函数在图像叠加、水印添加、视频特效等场景中很常用。二、图像边框与阈值处理2.1 为图像添加边框 —— cv2.copyMakeBorder()为图像添加边框可以用cv2.copyMakeBorder()支持多种填充方式import cv2 ys cv2.imread(4.jpg) top, bottom, left, right 50, 50, 50, 50 1. 常量边框用固定颜色填充 constant cv2.copyMakeBorder(ys, top, bottom, left, right, borderTypecv2.BORDER_CONSTANT, value[229, 25, 80]) 2. 镜像边框以边缘为轴进行镜像 reflect cv2.copyMakeBorder(ys, top, bottom, left, right, borderTypecv2.BORDER_REFLECT) 3. 镜像边框不含边界与 REFLECT 类似但不包含边界像素 reflect101 cv2.copyMakeBorder(ys, top, bottom, left, right, borderTypecv2.BORDER_REFLECT101) 4. 复制边框复制边缘像素 replicate cv2.copyMakeBorder(ys, top, bottom, left, right, borderTypecv2.BORDER_REPLICATE) 5. 环绕边框用对面边界的像素填充 warp cv2.copyMakeBorder(ys, top, bottom, left, right, borderTypecv2.BORDER_WRAP)五种边框类型的效果对比边框类型OpenCV 常量说明常量边框BORDER_CONSTANT用指定颜色值填充边框区域镜像边框BORDER_REFLECT以边缘像素为镜像轴向外镜像扩展如 fedcba|abcdefgh|hgfedcb反射101BORDER_REFLECT101以边缘像素为对称中心如 gfedcb|abcdefgh|gfedcba复制边框BORDER_REPLICATE直接复制最边缘的像素值如 aaaaaa|abcdefgh|hhhhhhh环绕边框BORDER_WRAP用对面边界的像素来填充如 cdefgh|abcdefgh|abcdefg默认推荐BORDER_REFLECT101 是 OpenCV 中许多函数如滤波的默认边框处理方式它在大多数场景下表现最佳。2.2 阈值处理 —— cv2.threshold()阈值处理是图像分割中最基础的方法之一设定一个阈值将像素值与阈值比较根据比较结果对像素分类。OpenCV 提供了五种阈值处理类型image cv2.imread(4.jpg, 0) # 以灰度模式读取 参数源图像, 阈值, 最大值, 阈值类型 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) # 反阈值归零阈值类型处理规则效果描述THRESH_BINARYdst maxVal 若 src thresh否则 0超过阈值为白色否则为黑色THRESH_BINARY_INVdst 0 若 src thresh否则 maxVal二值化的反转版本THRESH_TRUNCdst thresh 若 src thresh否则 src超过阈值的像素被截断为阈值THRESH_TOZEROdst src 若 src thresh否则 0低于阈值的像素归零THRESH_TOZERO_INVdst 0 若 src thresh否则 src高于阈值的像素归零返回值ret是实际使用的阈值在使用 Otsu 等自适应方法时可能与传入值不同binary等是处理后的图像。应用场景阈值处理常用于文档扫描二值化、物体轮廓提取、前景/背景分离等任务。三、图像噪声与滤波3.1 椒盐噪声的生成椒盐噪声Salt-and-Pepper Noise是图像中常见的噪声类型表现为随机出现的黑白像素点像撒了盐和胡椒一样。可以手动模拟这种噪声import numpy as np def add_peppersalt_noise(image, n10000): 向图像添加椒盐噪声 Args: image: 输入图像 n: 噪声点数量 Returns: 添加了噪声的图像 result image.copy() h, w image.shape[:2] # 获取图像的高和宽 for i in range(n): x np.random.randint(0, h) # 随机行坐标 y np.random.randint(0, w) # 随机列坐标 if np.random.randint(0, 2) 0: result[x][y] 0 # 黑点胡椒噪声 else: result[x][y] 255 # 白点盐噪声 return result这段代码会在图像的随机位置生成黑白噪声点模拟真实场景中的椒盐噪声。3.2 均值滤波 —— cv2.blur() 与 cv2.boxFilter()均值滤波是最简单的线性滤波方法它用像素邻域的平均值来替代中心像素的值# 均值滤波5x5 的卷积核 blur_1 cv2.blur(noise, (5, 5)) 方框滤波当 normalizeTrue 时与均值滤波等效 boxFilter_1 cv2.boxFilter(noise, -1, (3, 3), normalizeTrue) 方框滤波normalizeFalse 时求和但不平均容易溢出 boxFilter_2 cv2.boxFilter(noise, -1, (3, 3), normalizeFalse)参数说明-1输出图像的深度-1表示与输入图像一致(3, 3)卷积核大小normalizeTrue是否对结果进行归一化处理注意当normalizeFalse时方框滤波不再除以核面积像素值容易超过 255导致画面一片白。3.3 高斯滤波 —— cv2.GaussianBlur()高斯滤波使用高斯函数作为权重分配离中心越近的像素权重越大去噪的同时能更好地保留边缘信息# 高斯滤波核大小 (3,3)标准差为 1 Gaussian_Noise cv2.GaussianBlur(noise, (3, 3), 1)参数说明(3, 3)是高斯核的大小必须是奇数1是 X 方向的标准差如果设为 0则根据核大小自动计算。3.4 中值滤波 —— cv2.medianBlur()中值滤波是非线性滤波它用邻域像素的中值替代中心像素对椒盐噪声的去除效果尤其出色# 中值滤波核大小为 3 medianB cv2.medianBlur(noise, 3)3.5 滤波效果对比结论对于椒盐噪声中值滤波是首选方案。它能在有效去除椒盐噪声的同时最大限度地保留图像的边缘细节。四、综合实战4.1 实战一摄像头实时画面与背景图融合这是一个综合运用图像运算的实战案例实现摄像头实时画面与背景图片的融合效果import cv2 cap cv2.VideoCapture(0) background cv2.imread(4.jpg) background cv2.resize(background, (640, 480)) background_gray cv2.cvtColor(background, cv2.COLOR_BGR2GRAY) if not cap.isOpened(): print(无法打开摄像头) exit() while True: ret, frame cap.read() if not ret: break frame cv2.resize(frame, (640, 480)) frame_gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 彩色融合各占 50% 透明度 c1 cv2.addWeighted(frame, 0.5, background, 0.5, 100) 灰度融合各占 50% 透明度 c2 cv2.addWeighted(frame_gray, 0.5, background_gray, 0.5, 100) cv2.imshow(Color Fusion, c1) cv2.imshow(Gray Fusion, c2) 按下 ESC 键退出 if cv2.waitKey(60) 27: break cap.release() cv2.destroyAllWindows()4.2 实战二视频椒盐噪声处理对视频文件逐帧添加椒盐噪声并使用中值滤波进行去噪import cv2 import numpy as np def add_peppersalt_noise(image, n8000): result image.copy() h, w image.shape[:2] for i in range(n): x np.random.randint(0, h) y np.random.randint(0, w) if np.random.randint(0, 2) 0: result[x][y] 0 else: result[x][y] 255 return result cap cv2.VideoCapture(test.avi) if not cap.isOpened(): print(无法打开视频文件) exit() while True: ret, frame cap.read() if not ret: break # 添加椒盐噪声 noise add_peppersalt_noise(frame) 中值滤波去噪 medianB cv2.medianBlur(noise, 3) 同时显示三个窗口 cv2.imshow(Original, frame) # 原视频 cv2.imshow(Noise, noise) # 含噪声视频 cv2.imshow(Denoised, medianB) # 去噪后视频 if cv2.waitKey(60) 27: break cap.release() cv2.destroyAllWindows()五、总结今天的学习内容涵盖了 OpenCV 图像处理的三个核心模块模块核心函数要点图像运算cv2.add(),cv2.addWeighted()区分 NumPy 取模加法与 OpenCV 饱和加法掌握加权融合阈值处理cv2.threshold(),cv2.copyMakeBorder()五种阈值类型 五种边框填充方式滤波去噪cv2.blur(),cv2.boxFilter(),cv2.GaussianBlur(),cv2.medianBlur()椒盐噪声首选中值滤波这些知识都是后续学习更高级图像处理操作如边缘检测、形态学操作、轮廓提取等的基础建议动手运行每一段代码观察不同参数带来的效果变化。

相关新闻

RAG 文档切分实战:chunk_size、chunk_overlap、递归分块与语义分块怎么选?

RAG 文档切分实战:chunk_size、chunk_overlap、递归分块与语义分块怎么选?

RAG 文档切分实战:chunk_size、chunk_overlap、递归分块与语义分块怎么选?RAG 回答不准确,不一定是 Embedding 模型或向量库的问题。很多时候,真正的错误发生在入库之前:一条因果关系被从中间切断,标题和正…

2026/8/3 4:37:57阅读更多 →
【导弹】6自由度导弹制导、导航与控制模拟【含Matlab源码 15917期】

【导弹】6自由度导弹制导、导航与控制模拟【含Matlab源码 15917期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…

2026/8/3 4:37:57阅读更多 →
Pintos实验2:用户程序加载与系统调用实现全解析

Pintos实验2:用户程序加载与系统调用实现全解析

1. 项目概述:从理论到实践的Pintos操作系统实验如果你正在学习操作系统课程,或者对操作系统的内部运行机制充满好奇,那么“Pintos”这个名字你一定不陌生。它是一个由斯坦福大学开发,专门用于教学的小型操作系统内核。而“实验2us…

2026/8/3 4:37:57阅读更多 →
科颜氏白泥拿货别只看价:源头工厂老炮教你从料体工艺验货到B端利润防比价

科颜氏白泥拿货别只看价:源头工厂老炮教你从料体工艺验货到B端利润防比价

昨天有个白牌定制老板拎着一瓶某美系头部矿物泥膜体系来找我,说上家给的源头出厂底价确实低,结果终端用户反馈上脸刺痛,还浮了一层白霜。我说你把料体刮出来看看,果然,干得跟腻子粉似的,一捻全是砂粒感。这…

2026/8/3 10:43:19阅读更多 →
Hot100榜单解析:音乐流行度的算法与趋势

Hot100榜单解析:音乐流行度的算法与趋势

1. Hot100榜单解析:流行文化的风向标Hot100榜单作为全球最具影响力的音乐排行榜之一,每周更新一次,反映了当下最受欢迎的100首单曲。这个由权威音乐杂志发布的榜单,已经成为音乐产业的风向标,不仅影响着唱片公司的营销…

2026/8/3 10:43:19阅读更多 →
深度解析VRM-Addon-for-Blender:专业VRM工作流实战指南

深度解析VRM-Addon-for-Blender:专业VRM工作流实战指南

深度解析VRM-Addon-for-Blender:专业VRM工作流实战指南 【免费下载链接】VRM-Addon-for-Blender VRM Importer, Exporter and Utilities for Blender 2.93 to 5.2 项目地址: https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender VRM-Addon-for-Blender…

2026/8/3 10:43:19阅读更多 →
React 19中useRef类型系统的演进与最佳实践

React 19中useRef类型系统的演进与最佳实践

1. 从一次诡异的类型错误说起去年在重构一个历史项目时,我遇到了一个令人抓狂的类型问题。当时我正在将一个React 16的老项目升级到TypeScript,在处理useRef相关代码时,TypeScript突然报出了一个看似毫无道理的类型错误:const inp…

2026/8/3 10:43:19阅读更多 →
免费开源游戏串流神器:Sunshine完整指南与实战教程

免费开源游戏串流神器:Sunshine完整指南与实战教程

免费开源游戏串流神器:Sunshine完整指南与实战教程 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在客厅大屏电视上畅玩PC游戏,或是在平板上继续你的游…

2026/8/3 10:43:19阅读更多 →
如何高效清理Windows系统:开源工具Windows Cleaner完整使用指南

如何高效清理Windows系统:开源工具Windows Cleaner完整使用指南

如何高效清理Windows系统:开源工具Windows Cleaner完整使用指南 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否经常遇到C盘空间不足的警告&…

2026/8/3 10:41:19阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 0:29:53阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/3 0:33:53阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/3 0:20:37阅读更多 →
3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:32阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/3 2:32:59阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/3 2:33:01阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/3 2:33:04阅读更多 →