OpenCV 图像处理保姆级笔记:边界填充 | 阈值处理 | 滤波降噪全上手

发布时间:2026/9/21 21:43:49

OpenCV 图像处理保姆级笔记:边界填充 | 阈值处理 | 滤波降噪全上手 最近在入门计算机视觉从 OpenCV 基础操作开始学起今天把图像运算、边界填充、阈值处理、图像滤波这几块核心内容都跑了一遍每个知识点都写了可直接运行的小 demo最后还完成了两个综合小作业。整理成博客一方面自己复盘用另一方面也给同样入门的朋友做参考代码复制就能跑记得把图片、视频路径换成自己本地的就行。一、图像基础运算直接相加与加权融合图像运算本质就是对每个像素点的数值做计算这里有个很容易踩坑的点numpy 数组直接相加和OpenCV 自带的 add 函数运算规则完全不一样。直接用号numpy 是取模运算像素值超过 255 就对 256 取余比如 25020270最终结果是 14画面反而会发黑。用cv2.add()饱和运算超过 255 的数值直接截断为 255符合我们 “加亮度、画面变亮” 的直观预期。除此之外cv2.addWeighted()可以实现两张图的加权融合也就是带透明度的叠加效果日常用得非常多。import cv2 # 读取两张测试图片 a cv2.imread(image1.jpg) b cv2.imread(image2.jpg) # 1. 单张图像整体加亮度numpy直接相加会取模 c a 10 cv2.imshow(原图a, a) cv2.imshow(a10numpy加法, c) cv2.waitKey(0) # 2. 两张图局部区域直接相加必须保证尺寸一致 # 先截取相同大小的区域再做加法 c a[100:522, 150:700] b[100:522, 150:700] cv2.imshow(abnumpy直接相加, c) cv2.waitKey(0) # 统一两张图的尺寸方便后续运算 a cv2.resize(a, (1239, 622)) b cv2.resize(b, (1239, 622)) # 3. OpenCV的add函数饱和运算超过255截断为255 c cv2.add(a, b) cv2.imshow(abcv2.add饱和运算, c) cv2.waitKey(0) # 4. 加权融合a占70%权重b占30%权重最后整体偏移10个亮度值 c cv2.addWeighted(a, 0.7, b, 0.3, 10) cv2.imshow(加权融合addWeighted, c) cv2.waitKey(0) cv2.destroyAllWindows()跑的时候对比会很明显直接相加的画面会出现很多异常的黑斑就是像素溢出取模导致的cv2.add 整体会更亮加权融合则可以做出自然的半透明叠加效果。二、图像边界填充的五种方式做卷积、滤波操作的时候经常需要给图像边缘填充像素保证输出尺寸和原图一致。OpenCV 提供了 5 种不同的填充策略用cv2.copyMakeBorder()实现效果差别挺大的。五种填充类型说明BORDER_CONSTANT用固定纯色填充边界需要自己指定颜色BORDER_REFLECT镜像反射填充以边缘像素为轴向外镜像BORDER_REFLECT101对称反射不包含边缘像素本身过渡更自然BORDER_REPLICATE复制最边缘的像素一直向外延伸BORDER_WRAP平铺环绕相当于把图像重复平铺取外围部分import cv2 # 读取测试图片 img cv2.imread(test.jpg) # 定义上下左右四个方向的填充像素宽度 top, bottom, left, right 50, 50, 50, 50 # 1. 纯色填充value指定BGR颜色值 constant cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value(229, 25, 80)) # 2. 镜像反射 reflect cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_REFLECT) # 3. 对称反射不含边缘像素 reflect101 cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_REFLECT101) # 4. 复制边缘像素 replicate cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_REPLICATE) # 5. 平铺环绕 wrap cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_WRAP) # 依次显示对比效果 cv2.imshow(原图, img) cv2.waitKey(0) cv2.imshow(CONSTANT纯色填充, constant) cv2.waitKey(0) cv2.imshow(REFLECT镜像反射, reflect) cv2.waitKey(0) cv2.imshow(REFLECT101对称反射, reflect101) cv2.waitKey(0) cv2.imshow(REPLICATE复制边缘, replicate) cv2.waitKey(0) cv2.imshow(WRAP平铺环绕, wrap) cv2.waitKey(0) cv2.destroyAllWindows()日常做滤波处理时默认用得最多的是BORDER_REFLECT101边界过渡最自然不会出现明显的断层感。三、五种阈值处理方式阈值处理是图像二值化的基础核心就是设定一个阈值把像素分成两类必须基于灰度图进行。OpenCV 的cv2.threshold()提供了 5 种常用模式。以阈值 175、最大值 255 为例五种模式的效果THRESH_BINARY二值化大于阈值变 255小于阈值变 0THRESH_BINARY_INV反二值化和上面相反大于阈值变 0小于变 255THRESH_TRUNC截断大于阈值的都等于阈值小于的保持原值THRESH_TOZERO置零大于阈值的保持不变小于的变成 0THRESH_TOZERO_INV反置零大于阈值的变成 0小于的保持不变import cv2 # 以灰度模式读取图片参数0表示灰度读取 image cv2.imread(test.jpg, 0) # 五种阈值处理阈值设为175像素最大值255 ret1, binary cv2.threshold(image, 175, 255, cv2.THRESH_BINARY) # 二值化 ret2, binaryinv cv2.threshold(image, 175, 255, cv2.THRESH_BINARY_INV) # 反二值化 ret3, trunc cv2.threshold(image, 175, 255, cv2.THRESH_TRUNC) # 截断 ret4, tozero cv2.threshold(image, 175, 255, cv2.THRESH_TOZERO) # 置零 ret5, tozeroinv cv2.threshold(image, 175, 255, cv2.THRESH_TOZERO_INV) # 反置零 # 依次查看每种效果 cv2.imshow(灰度原图, image) cv2.waitKey(0) cv2.imshow(二值化BINARY, binary) cv2.waitKey(0) cv2.imshow(反二值化BINARY_INV, binaryinv) cv2.waitKey(0) cv2.imshow(截断TRUNC, trunc) cv2.waitKey(0) cv2.imshow(置零TOZERO, tozero) cv2.waitKey(0) cv2.imshow(反置零TOZERO_INV, tozeroinv) cv2.waitKey(0) cv2.destroyAllWindows()固定阈值的缺点是对光照变化很敏感后面学到自适应阈值会好用很多。阈值数值需要根据自己的图片亮度、对比度灵活调整。四、图像降噪四种滤波方法对比实拍的图像经常会有噪声最常见的就是椒盐噪声随机分布的黑白点。滤波就是用来消除噪声、平滑画面的不同算法的适用场景和效果差异很大。我们先手动给图片加上椒盐噪声再分别用四种滤波方法处理直观对比效果。四种常用滤波均值滤波取邻域像素平均值实现最简单但会把边缘也一起模糊方框滤波和均值原理类似可选是否归一化不归一化就是直接求和容易过曝高斯滤波按高斯分布加权离中心越近权重越高保边效果比均值滤波好中值滤波取邻域像素的中位数对椒盐噪声效果极佳能较好保留边缘import cv2 import numpy as np # 自定义函数给图片添加椒盐噪声 # 参数n为噪声点的数量 def add_peppersalt_noise(img, n1000): result img.copy() h, w img.shape[:2] for i in range(n): # 随机生成像素坐标 x np.random.randint(h) y np.random.randint(w) # 随机设置为黑点(0)或白点(255) if np.random.randint(2) 0: result[x, y] 0 else: result[x, y] 255 return result # 读取原图 image cv2.imread(test.png) cv2.imshow(原图, image) cv2.waitKey(0) # 添加椒盐噪声 noise_img add_peppersalt_noise(image) cv2.imshow(加椒盐噪声后, noise_img) cv2.waitKey(0) # 1. 均值滤波 3x3卷积核 blur_1 cv2.blur(noise_img, (3, 3)) cv2.imshow(均值滤波3x3, blur_1) cv2.waitKey(0) # 卷积核越大模糊效果越明显 blur_2 cv2.blur(noise_img, (25, 25)) cv2.imshow(均值滤波25x25, blur_2) cv2.waitKey(0) # 2. 方框滤波 # normalizeTrue 归一化效果和均值滤波完全一致 boxFilter_1 cv2.boxFilter(noise_img, -1, (3, 3), normalizeTrue) cv2.imshow(方框滤波(归一化), boxFilter_1) cv2.waitKey(0) # normalizeFalse 不归一化像素直接求和很容易饱和到255 boxFilter_2 cv2.boxFilter(noise_img, -1, (3, 3), normalizeFalse) cv2.imshow(方框滤波(不归一化), boxFilter_2) cv2.waitKey(0) # 3. 高斯滤波标准差设为1 GaussianB cv2.GaussianBlur(noise_img, (3, 3), 1) cv2.imshow(高斯滤波, GaussianB) cv2.waitKey(0) # 4. 中值滤波 3x3 medianB cv2.medianBlur(noise_img, 3) cv2.imshow(中值滤波, medianB) cv2.waitKey(0) cv2.destroyAllWindows()亲测对于椒盐噪声中值滤波的效果是碾压级的黑白点基本都能消掉画面还不会特别糊。均值和高斯滤波会把整个画面都磨平细节损失比较大。五、实战作业 1摄像头实时画面与背景图片融合第一个综合练习实现摄像头实时画面和背景图的加权融合同时输出彩色和灰度两个版本的画面。实现要求背景图缩放为 640x480 尺寸分别生成彩色融合、灰度融合两路画面两个窗口同时实时显示import cv2 # 读取背景图并缩放到640x480和摄像头默认尺寸匹配 bg cv2.imread(background.jpg) bg cv2.resize(bg, (640, 480)) # 生成灰度版背景图 bg_gray cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY) # 打开默认摄像头设备号一般为0 cap cv2.VideoCapture(0) while True: # 读取一帧画面 ret, frame cap.read() if not ret: print(摄像头读取失败) break # 将摄像头当前帧转为灰度图 frame_gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 彩色画面加权融合背景和摄像头各占50%亮度偏移10 result_color cv2.addWeighted(bg, 0.5, frame, 0.5, 10) # 灰度画面加权融合 result_gray cv2.addWeighted(bg_gray, 0.5, frame_gray, 0.5, 10) # 同时弹出两个窗口 cv2.imshow(彩色融合画面, result_color) cv2.imshow(灰度融合画面, result_gray) # 按ESC键退出循环ESC的ASCII码为27 if cv2.waitKey(20) 27: break # 释放摄像头资源关闭所有窗口 cap.release() cv2.destroyAllWindows()这里要注意如果你的摄像头默认分辨率不是 640x480需要把 frame 也 resize 成和背景图一样的尺寸不然 addWeighted 会报错。六、实战作业 2视频逐帧加噪声 实时降噪第二个综合练习处理本地视频文件给每一帧添加椒盐噪声再用滤波降噪同时显示原视频、噪声视频、降噪后视频三个窗口。import cv2 import numpy as np # 给单帧画面添加椒盐噪声默认添加8000个噪声点 def add_salt_pepper_noise(frame, n8000): result frame.copy() h, w frame.shape[:2] for i in range(n): x np.random.randint(h) y np.random.randint(w) # 随机设置为白点或黑点 if np.random.randint(2) 1: result[x, y] 255 else: result[x, y] 0 return result # 读取本地视频文件 cap cv2.VideoCapture(test.avi) while True: # 读取一帧画面 ret, frame cap.read() if not ret: print(视频播放结束或读取失败) break # 1. 给当前帧添加椒盐噪声 noise_frame add_salt_pepper_noise(frame) # 2. 中值滤波降噪针对椒盐噪声效果最优 denoise_frame cv2.medianBlur(noise_frame, 3) # 三个窗口同步播放 cv2.imshow(原视频, frame) cv2.imshow(加噪声后, noise_frame) cv2.imshow(中值滤波降噪后, denoise_frame) # 按ESC键退出 if cv2.waitKey(20) 27: break # 释放视频资源 cap.release() cv2.destroyAllWindows()这里选择中值滤波就是因为它对椒盐噪声效果最好3 的核大小既能消除大部分噪声又不会让画面过度模糊。如果噪声特别密集可以把核大小调到 5但画面清晰度会有所下降。
延伸阅读

更多相关文章

2026/9/21 4:24:17

The Archer模板开发Roguelike游戏的核心技术与实践

1. 为什么选择The Archer模板开发Roguelike游戏在独立游戏开发领域,Roguelike类型因其高重玩价值而持续走热。但这类游戏的核心机制实现起来并不简单——永久死亡、随机生成、道具组合等系统都需要扎实的底层架构。这正是The Archer模板的价值所在:它提供…

2026/9/20 21:20:12

AI 时代的“HTML 时刻”:一个被严重低估的知识标准 OKF

国内大多数人还在讨论模型、MCP、Skills 和 Agent Harness。 但 Google 最近正在推动另一件更底层的事情: 知识应该以什么格式存在,才能被人和 Agent 共同读取、维护、交换与验证? 真正重要的标准,刚出现时往往显得异常朴实无华。…

2026/9/21 21:39:32

搞懂拓展训练感想这3个坑,最佳实践让你学时不白丢

搞懂拓展训练感想这3个坑,最佳实践让你学时不白丢 你是不是也遇到过这种糟心事儿?书上的语法背得滚瓜烂熟,一上手写项目就卡壳,或者对着屏幕发呆不知从何搭起。这种“会语法不会干活”的断层,在编程圈太常见了。今天咱们不聊虚的,直接拆解【拓展训练感…

2026/9/21 21:39:32

词博源码拆解:新手避坑指南与实战

词博源码拆解:新手避坑指南与实战 复制来的代码跑不通不知道怎么调,这是无数新手在接触【词博】时的第一道坎。很多教程只给结论,不给过程,导致你看着能懂,一动手就报错。今天这篇【新手避坑】指南,直接带你潜入【词博】核心源码,不吹牛,只讲干货。我…

2026/9/21 21:39:32

JVM调优实战:解决频繁FullGC的深度分析与优化策略

1. JVM调优实战:频繁FullGC问题深度解析最近在技术社区看到不少朋友讨论JVM调优的问题,特别是关于频繁Full GC的处理方案。作为一个经历过多次生产环境JVM问题排查的老兵,我想分享一些实战经验。很多人对Full GC的理解还停留在"调大堆内…

2026/9/21 21:39:32

3个核心逻辑吃透131组合,告别教程依赖

3个核心逻辑吃透131组合,告别教程依赖 看了一堆教程还是不会写项目?这是绝大多数转行程序员最大的痛点。 你背了无数API,看懂了视频里的Demo,但一旦脱离指导文档,面对空白的编辑器就大脑一片空白。…

2026/9/21 21:39:32

树状数组统计中位数条件的子数组数量

1. 问题背景与核心思路这道题目来自USACO竞赛的普及级别,考察的是树状数组(Binary Indexed Tree, BIT)在统计问题中的灵活应用。题目要求统计满足特定中位数条件的子数组数量,属于经典算法题目的变种。先理解题目核心:…

2026/9/21 21:34:32

虚拟电厂低碳优化:阶梯碳交易与P2G-CCS技术实践

1. 项目概述与背景在能源结构转型的大背景下,虚拟电厂(Virtual Power Plant, VPP)作为整合分布式能源资源的关键技术,正面临低碳化运营的迫切需求。我最近完成了一个结合阶梯碳交易机制与多项低碳技术的虚拟电厂优化调度项目&…

2026/9/21 3:28:31

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/21 3:33:19

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/21 0:02:23

OpenResearch:构建可复现的开放式研究工作流

第一次看到“OpenResearch”这个名字,我脑子里冒出的不是某个具体软件,而更像一种研究方式的宣言:开放、可复现、可验证。这三件事放在一起,其实比大多数人想象中难得多。过去几年我一直在折腾自己的研究工作流,从纯纸…

2026/9/20 4:54:47

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/21 18:32:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/21 10:29:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码