OpenCV
核心内容考试重点/易混淆点难度系数通过设定阈值对像素点进行二值化处理(如127为界,大于取255,小于取0)阈值类型选择(二值法、反转二值法、截断法、TOZERO等)⭐⭐二值法(:大于阈值取最大值(255),小于阈值取0反转二值法()逻辑相反⭐⭐截断法(:大于阈值的像素值截断为阈值,小于阈值保留原值仅对高亮部分限制,不影响暗部⭐⭐TOZERO(:大于阈值保留原值,小于阈值置0反转TOZERO()亮
课时1:python和opencv配置安装_笔记
一、课程安排与介绍
- 教学风格:采用通俗易懂的讲解方式,用生活化语言解析复杂概念
- 课程结构:采用"理论+实践"的教学模式,每学完几个知识点配套一个实战项目
- 难度梯度:从零基础到进阶,前期学习计算机视觉基础操作和OpenCV函数,后期完成大型项目
- 学习基础:需掌握Python基础语法(无需精通),课程全程使用Python实现
- 配套资源:提供完整课程资料和代码,并持续更新维护
二、环境配置
- Anaconda安装
- 功能特点:
- 集成Python环境、包管理工具和开发工具
- 包含Conda包管理器(支持1400+数据科学包)
- 内置Jupyter Notebook交互环境
- 安装优势:
- 一键安装,自动配置环境变量
- 智能解决依赖关系
- 支持多Python版本管理
- 下载安装:
- 官网下载:https://www.anaconda.com/download/
- 选择对应系统版本(Windows/macOS/Linux)
- 推荐Python 3.7版本(64位安装包)
- 运行安装程序,默认设置完成安装
-
OpenCV安装

-
准备工作:确保已安装Python环境(推荐Anaconda)
-
版本建议:opencv-python==3.4.1.15(3.4.2+版本存在功能限制)
-
安装步骤:
- 打开Anaconda Prompt
- 执行:
pip install opencv-python==3.4.1.15 - 安装扩展包:
pip install opencv-contrib-python==3.4.1.15
-
验证方法:
- Python命令行执行
import cv2 - 检查版本号:
cv2.__version__应为3.4.1
- Python命令行执行
-
注意事项:
- 可切换国内镜像源加速安装
- 确保基础包和扩展包版本一致
- 建议先测试导入成功再开发
-
三、知识小结
| 分类维度 | 核心内容 | 关键要点 |
|---|---|---|
| 课程定位 | OpenCV计算机视觉实战 | 零基础到进阶,需Python基础 |
| 教学特色 | 项目驱动式教学 | 理论→案例→项目渐进式学习 |
| 技术栈 | OpenCV-Python | 推荐3.4.1.15版本,需配套安装contrib包 |
| 环境配置 | Anaconda集成环境 | 含Jupyter Notebook,自动解决依赖 |
| 安装方法 | pip安装 | 指定版本安装,注意专利算法兼容性 |
| 学习路径 | 分层递进 | 基础操作→特征提取→目标检测 |
| 资源支持 | 配套资料 | 持续更新,一键下载 |
| 版本注意 | 功能限制 | 3.4.2+版本存在算法缺失 |
| 开发工具 | Conda环境 | 多版本管理,隔离项目依赖 |
课时2:NoteBook和IDE环境_笔记
Windows 非官方 Python 工具包安装指南
一、安装方法
1. 常规安装
- 推荐方式:使用
pip install命令直接安装,操作简单高效 - 安装验证:通过
import 包名和查看版本号确认安装结果 - pip升级:低版本提示时执行
python -m pip install --upgrade pip
2. 备用方案(UCI 站点)

- 站点说明:加州大学欧文分校维护的 Windows Python 扩展包仓库
- 资源特点:
- 提供科学计算类扩展包的预编译版本(32/64位)
- 需注意:
- 非官方版本,无技术支持保障
- 要求 pip ≥9.0 才能安装 .whl 文件
- 多数包依赖 numpy-1.15+mkl 和特定 VC++ 运行库
3. OpenCV 专项安装

- 版本选择:
- 文件名格式:
包名-版本号-cpPython版本-系统位数.whl - 推荐版本:2.4.x 或 3.3.x 系列(4.x 可能存在兼容问题)
- 文件名格式:
- 安装流程:
- 下载匹配的 .whl 文件
- 复制到 Scripts 目录
- 执行
pip install 文件名
- 验证方法:
import cv2后查看cv2.__version__
4. 常见问题处理
- 失败原因:
- Python版本/系统位数不匹配
- 缺失依赖项(numpy/VC++运行库)
- 解决方案:
- 在非官方网站检索适配版本
- 先安装依赖项再重试主包
- 特殊版本需求可通过搜索引擎获取
二、Notebook 使用指南

- 启动流程:
- 通过 Anaconda Navigator 启动 Jupyter Notebook
- 自动弹出命令行窗口并在浏览器打开本地8888端口
- 手动访问:复制命令行中的带token链接到浏览器
- 环境测试:新建 Python3 Notebook 执行基础代码验证
三、图像处理基础
1. 背景建模技术

- 帧差法:
- 公式:
𝐷𝑛(𝑥,𝑦)=∣𝑓𝑛(𝑥,𝑦)−𝑓𝑛−1(𝑥,𝑦)∣ - 原理:灰度差超阈值T即为运动目标,输出二值图像
- 公式:
- 混合高斯模型:
- 训练阶段:
- 初始化参数
- 使用前T帧训练
- 3σ范围内更新分布参数
- 不匹配时新建分布
- 测试阶段:2σ范围内判为背景(0),否则前景(255)
- 训练阶段:
2. 代码实现
- 核心方法:
cv2.createBackgroundSubtractorMOG2()创建模型apply()获取前景掩膜- 结合形态学运算降噪
- 轮廓检测标记目标
- 交互优势:
- 支持分块执行(Shift+Enter)
- 实时变量查看
- 便于分步调试
四、环境配置建议

-
基础环境:
- Anaconda下载:官网获取
- whl文件站点:UCI镜像库
- IDE选择:推荐支持debug的环境(如PyCharm/Eclipse)
-
版本推荐:
- OpenCV 3.4.1.15(规避专利限制)
- 安装顺序:先配Python环境,再装OpenCV
-
工具分工:
- 理论演示:Jupyter Notebook
- 项目实战:Eclipse/PyCharm
- 环境验证:基础图像操作测试
知识要点速查
| 知识点 | 核心内容 | 注意事项 | 难度 |
|---|---|---|---|
| OpenCV安装 | 1. pip优先 2. whl备用 3. 推荐3.4.1版 | 版本匹配关键:cp3x(Python版)、win32/64(系统位) | ⭐⭐ |
| 开发环境 | 1. Notebook理论演示 2. IDE项目开发 | Notebook优势:混合Markdown、分步执行 | ⭐ |
| 代码规范 | 1. Notebook理论 2. IDE实战项目 | Notebook局限:不适大型项目、缺Debug | ⭐⭐ |
| 环境排查 | 1. 端口8888检查 2. 手动访问 | 常见错误:whl版本冲突、依赖缺失 | ⭐⭐⭐ |
| 版本选择 | 1. OpenCV 3.4.x 2. Python 3.6+ | 避坑:慎用最新版(如OpenCV 4.x) | ⭐⭐ |
课时3:计算机眼中的图像_笔记
计算机眼中的图像

像素点定义:图像由无数小方格(像素点)组成,每个小格代表一个像素点,是构成图像的基本单位。
像素值范围:每个像素点的值在0-255之间,0表示纯黑,255表示纯白,中间值表示不同亮度。
彩色图像结构:彩色图像由RGB三个颜色通道组成,每个通道都是一个矩阵,如500×500×3表示高500像素、宽500像素的彩色图。
灰度图像特点:黑白图像(灰度图)只有单通道,仅用亮度值表示,不需要RGB三个通道。
图像基本操作:数据读取

基本工具包:
import cv2:OpenCV库,读取格式为BGRimport matplotlib.pyplot as plt:绘图展示import numpy as np:数值计算
魔法指令:%matplotlib inline用于在Jupyter中自动显示图像,无需调用plt.show()。
读取函数:cv2.imread('filename')从当前路径读取图像,返回numpy数组结构。
示例代码:
- 数据结构:读取结果为
ndarray结构,dtype为uint8(0-255范围)。 - 维度表示:使用
(h,w,c)表示图像形状,如(414,500,3)表示高414像素、宽500像素的3通道彩色图。 
显示函数:cv2.imshow('窗口名', 图像变量):创建显示窗口cv2.waitKey(0):0表示按任意键关闭,数值表示显示毫秒数(如10000=10秒)cv2.destroyAllWindows():关闭所有窗口
格式注意:OpenCV默认使用BGR格式,与其他库(RGB)不同,直接使用OpenCV函数可避免转换问题。
实用技巧:可封装显示函数cy_show(name,img)简化重复代码。
知识小节
| 知识点 | 描述 | 示例/公式 |
|---|---|---|
| 变量定义 | 存储数据的容器,需声明类型和名称 | int age = 25; |
| 条件语句 | 根据条件执行不同代码块 | if (x > 0) { ... } else { ... } |
| 循环结构 | 重复执行代码直到满足终止条件 | for (int i=0; i<10; i++) { ... } |
| 函数 | 封装可重复使用的代码块,含输入和输出 | def add(a, b): return a + b |
| 数学公式 | 表达数学关系,常用符号和运算符 | E=mc2E=mc^2E=mc2 |
课时4:视频的读取与处理_笔记
图像基本操作
图像显示及绘图函数定义
使用cv2.imshow()创建显示窗口,cv2.waitKey(0)设置等待时间(毫秒级,0表示任意键终止),cv2.destroyAllWindows()关闭所有窗口。封装三行显示代码为cv_show(name, img)函数,参数包含窗口名称和图像数据,简化重复代码,提高复用性。
图像属性
shape属性返回(h, w, c)三元组,h表示高度(行数),w表示宽度(列数),c表示通道数(彩色图为3)。OpenCV彩色图通道顺序为BGR(非标准RGB),灰度图只有(h, w)两个维度。
灰度图
读取模式参数包括cv2.IMREAD_COLOR(默认彩色图)和cv2.IMREAD_GRAYSCALE(灰度图)。灰度图为单通道数据结构,像素值范围0-255,常用于检测/识别任务的预处理。转换方法:读取时指定参数cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE)或后续转换。
图像保存
使用cv2.imwrite('filename', img)保存图像,支持指定路径。图像数据存储为numpy的ndarray格式,可通过.size获取像素总数,.dtype查看数据类型(通常为uint8)。
视频读取及处理

视频本质与帧率
视频由多帧静止图像连续播放形成动态效果,帧率决定流畅度。30帧/秒为人眼感知流畅的临界值,15帧/秒会出现明显卡顿。游戏卡顿常因显卡处理帧率不足导致。
基本操作流程
初始化:cv2.VideoCapture()指定视频路径或摄像头设备号(0表示默认摄像头)。状态检查:isOpened()验证视频能否正常打开。帧读取:循环调用read()获取每一帧图像。终止条件:读取到None或用户按下ESC键(值27)时退出循环。
关键参数waitKey值控制帧间显示时长(毫秒级),值过小(如1)导致过快播放,适中值(如10)正常,过大值(如100)明显卡顿。read()返回元组(布尔状态值,当前帧图像数据)。
图像处理示例
彩色转灰度:cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)。显示控制:imshow()显示处理后的帧。资源释放:循环结束后调用release()和destroyAllWindows()。
实际应用与文件管理
人脸检测需逐帧处理视频流,性能优化影响实时性。视频帧本质是numpy的ndarray数组(彩色图为三维数组)。支持MP4、AVI等格式,需检查文件路径是否存在及可读性。
知识小节:
图像处理基础
| 主题 | 关键点 | 难度 |
|---|---|---|
| 图像显示函数封装 | 封装为CPS_how函数,参数需包含图像名称和对象 |
⭐ |
| 图像属性获取 | img.shape返回(高度, 宽度, 通道数),注意OpenCV默认BGR顺序 |
⭐⭐ |
| 灰度图读取与转换 | cv2.IMREAD_GRAYSCALE模式读取为单通道HW格式,彩色图为HWC格式 |
⭐⭐ |
| 图像保存 | cv2.imwrite需注意文件路径格式和系统权限 |
⭐ |
视频处理核心
| 主题 | 关键点 | 难度 |
|---|---|---|
| 视频处理原理 | cv2.VideoCapture逐帧读取,ret, frame = vc.read(),ret为False时终止 |
⭐⭐⭐ |
| 视频帧处理示例 | 灰度转换:cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) |
⭐⭐ |
| 视频播放控制 | cv2.waitKey(delay)控制帧间隔,ESC键码27,delay值越小播放越快 |
⭐⭐ |
| 视频与图像关系 | 视频为连续帧集合,帧率(FPS)≥30时人眼感知流畅 | ⭐⭐ |
课时5:ROl区域_笔记
- ROI区域

概念定义
ROI(Region of Interest)指图像中需要重点关注的区域,可通过切片操作提取特定部分。
实现方法
使用NumPy数组切片语法 img[y1:y2, x1:x2],如 img[0:200, 0:200] 表示截取左上角200×200像素区域。
应用场景
在后续图像处理中经常需要先提取ROI区域再进行特定操作,可减少计算量。
截取图像数据
操作原理
OpenCV读取的图像本质是NumPy数组,通过数组切片实现区域选择。
参数说明
示例中 0:200 表示从第0行/列到第200行/列(不包括200)的像素范围。
实际演示
当设置 h=50, w=200 时,实际截取的是高度50像素、宽度200像素的矩形区域。
颜色通道提取

通道顺序
OpenCV默认使用BGR顺序(注意不是常见的RGB),即 [:,:,0] 为蓝色通道,[:,:,1] 为绿色,[:,:,2] 为红色。
提取方法
使用 cv2.split(img) 直接分离为 b,g,r 三个单通道图像,或通过索引 img[:,:,n] 单独获取特定通道。
形状特性
每个单通道图像的 shape 为 (height, width),比原图少一个维度(原图为 (height, width, 3))。
颜色通道保留

实现原理
通过将其他两个通道置零来突出显示目标通道,如只保留R通道:
r_channel = img.copy()
r_channel[:, :, 0] = 0 # 置零B通道
r_channel[:, :, 1] = 0 # 置零G通道
视觉效果
- 仅R通道:呈现红色效果
- 仅G通道:显示绿色图像
- 仅B通道:显示蓝色图像
通道合并
使用 cv2.merge((b,g,r)) 可将分离的通道重新组合为彩色图像,合并后 shape 恢复为 (height, width, 3)。
注意事项
合并时必须严格按照BGR顺序传入参数,否则会导致颜色错乱。
验证方法
可通过 .shape 属性检查合并后的维度是否正确。
知识小结
| 知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 |
|---|---|---|---|
| ROI(Region of Interest) | 在图像中截取特定区域的操作,通过数组切片实现(如 [0:200, 50:200]) |
切片范围理解(行列顺序)、与原图尺寸关系 | ⭐⭐ |
| BGR通道分离与合并 | 使用 cv2.split() 或数组索引分离通道;cv2.merge() 合并 |
通道顺序混淆(BGR vs RGB)、单通道显示效果 | ⭐⭐⭐ |
| 单通道可视化 | 保留单一通道需将其他通道置零(如 [:,:,0]=0,[:,:,1]=0) |
通道索引对应颜色(0:B,1:G,2:R)、单通道意义 | ⭐⭐ |
| 图像数据结构 | OpenCV图像为三维数组(高度×宽度×通道),切片操作需保持维度一致 | 数组维度理解、切片越界处理 | ⭐⭐⭐ |
课时6:边界填充和数据计算
边界填充

函数原型:cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType)
参数说明:必须指定上下左右四个方向的填充大小(示例中均为50像素)。borderType决定填充方式,包括:复制法、反射法、反射101法、外包装法和常量法。
复制法
实现方式:cv2.BORDER_REPLICATE
原理:直接复制图像最边缘的像素进行填充
视觉特征:边界处会出现明显的像素重复带(如示例中猫图像边缘的重复条纹)
应用场景:简单快速但可能产生人工痕迹,适合对边界要求不高的场合
反射法
标准反射法:实现方式:cv2.BORDER_REFLECT
反射模式:fedcba|abcdefgh|hgfedcb
特点:包含边界像素的完全对称反射(如示例中猫图像的镜面对称效果)
反射101法:实现方式:cv2.BORDER_REFLECT_101
反射模式:gfedcb|abcdefgh|gfedcba
特点:以最边缘像素为轴,不重复边界像素(示例中边界过渡更自然)
关键区别:标准反射法包含边界像素重复,反射101法不重复边界像素
外包装法
实现方式:cv2.BORDER_WRAP
填充模式:cdefgh|abcdefgh|abcdefg
视觉特征:图像内容在边界处循环出现(如示例中猫图像呈现"平铺"效果)
应用注意:可能导致明显的周期性图案,不适合需要自然过渡的场景
效果展示
常量填充法:实现方式:cv2.BORDER_CONSTANT
必须指定value参数(示例中为0即黑色填充)
特点:生成固定颜色的边框(常用于图像分割任务)
综合对比:
- 复制法:边缘存在明显重复条纹
- 反射法:产生镜面反射效果
- 反射101:反射效果更自然
- 外包装法:形成循环平铺图案
- 常量法:生成纯色边框
选择建议:根据后续处理需求选择,卷积操作常用反射法保持特征连续性
数值计算
图像加载及基本运算
图像加载读取方法:使用cv2.imread()读取图像,返回numpy的ndarray结构
图像加法运算:
逐像素加法:对图像每个像素点进行数值加法,如img_cat2 = img_cat +10会使所有像素值增加10
数值溢出处理:当结果超过255时会自动取模运算(值%256)
示例验证:原始像素值142 → 加10后应为152;原始156 → 加10后应为166
图像相加运算:
普通加法:计算方式:直接相加后取模(如142+152=294→294%256=38)
特点:可能丢失高亮度信息
cv2.add():计算方式:结果超过255时直接截断为255
特点:保留高光区域信息
核心区别:
- Numpy加法:模运算处理溢出
- OpenCV加法:饱和处理溢出
图像融合
错误示范:直接相加不同尺寸图像会报ValueError
错误原因:图像维度不一致(如(414,500,3)与(429,499,3))
解决方法:必须先将图像调整为相同尺寸
resize方法:
两种指定方式:直接指定目标尺寸(宽,高);通过缩放因子(fx,fy)等比缩放
加权融合公式:
数学表达式:result = α*img1 + β*img2 + γ
参数说明:α为第一幅图像的权重(示例中0.4),β为第二幅图像的权重(示例中0.6),γ为亮度调节量(示例中0)
— 知识小节
边界填充(Padding)

| 核心内容 | 易混淆点/关键细节 | 难度系数 |
|---|---|---|
| 在图像变换时扩展边缘,常见于卷积操作前的预处理。支持上下左右均等或非均等填充,需指定填充像素值(如50)。 | 填充方法差异: • 复制法:直接复制边缘像素 • 反射法:镜像反射边缘像素(含/不含边界) • 外包装法:循环重复图像内容 • 常量法:固定值填充(如黑色) |
⭐⭐ |
图像数值计算
| 核心内容 | 易混淆点/关键细节 | 难度系数 |
|---|---|---|
| OpenCV与NumPy加法差异: • NumPy加法:越界时取模运算(294 % 256 = 38) • OpenCV加法:越界时截断至最大值(255) |
需注意数据类型(uint8范围0-255)及维度一致性 |
⭐⭐ |
图像融合
| 核心内容 | 易混淆点/关键细节 | 难度系数 |
|---|---|---|
加权叠加公式:result = α*img1 + β*img2 + γ• 需先统一图像尺寸( resize)• 权重α/β控制混合比例,γ调节亮度 |
尺寸匹配是前提,否则报错 | ⭐⭐ |
图像缩放(resize)
| 核心内容 | 易混淆点/关键细节 | 难度系数 |
|---|---|---|
| 支持两种参数模式: • 绝对尺寸:直接指定目标宽高(如500×500) • 相对比例:通过 fx/fy设置缩放倍数(如1.5倍) |
非等比缩放可能导致形变 | ⭐ |
课时7:图像阈值和图像平滑处理
图像阈值处理
函数原型ret, dst = cv2.threshold(src, thresh, maxval, type)
src: 输入图像(单通道,通常为灰度图)dst: 输出图像thresh: 阈值(实际数值,如127)maxval: 超过/低于阈值时赋予的值(通常为255)type: 阈值处理类型
阈值处理类型详解

二值化 (THRESH_BINARY)
- 规则:像素值 > 阈值 →
maxval(白色);像素值 ≤ 阈值 → 0(黑色) - 示例:阈值为127时,亮部变白,暗部变黑。
- 应用:高对比度图像的基础二值分割。
反二值化 (THRESH_BINARY_INV)
- 规则:像素值 > 阈值 → 0(黑色);像素值 ≤ 阈值 →
maxval(白色) - 特点:与
THRESH_BINARY结果相反。
截断阈值 (THRESH_TRUNC)
- 规则:像素值 > 阈值 → 设为阈值;像素值 ≤ 阈值 → 保持不变
- 效果:抑制过亮区域,保留暗部细节。
零阈值 (THRESH_TOZERO)
- 规则:像素值 > 阈值 → 保持不变;像素值 ≤ 阈值 → 0(黑色)
- 效果:保留亮部细节,抑制暗部。
反零阈值 (THRESH_TOZERO_INV)
- 规则:像素值 > 阈值 → 0(黑色);像素值 ≤ 阈值 → 保持不变
- 特点:保留暗部,抑制亮部。
图像平滑处理

均值滤波
- 例题:阈值图像展示

噪声特点:图像中包含明显的椒盐噪声(黑白噪点)
处理目标:通过滤波操作去除噪声点
方框滤波

- 与均值滤波关系:
normalize=True时等效。 - 核心区别:可选归一化参数。
- 非归一化问题:直接累加可能导致值溢出(截断为255)。
- 建议:通常使用
normalize=True避免过曝。
知识小结
图像阈值操作与滤波方法总结
图像阈值操作
| 核心内容 | 考试重点/易混淆点 | 难度系数 |
|---|---|---|
| 通过设定阈值对像素点进行二值化处理(如127为界,大于取255,小于取0) | 阈值类型选择(二值法、反转二值法、截断法、TOZERO等) | ⭐⭐ |
二值法(CV2.THRESH_BINARY):大于阈值取最大值(255),小于阈值取0 |
反转二值法(CV2.THRESH_BINARY_INV)逻辑相反 |
⭐⭐ |
截断法(CV2.THRESH_TRUNC):大于阈值的像素值截断为阈值,小于阈值保留原值 |
仅对高亮部分限制,不影响暗部 | ⭐⭐ |
TOZERO(CV2.THRESH_TOZERO):大于阈值保留原值,小于阈值置0 |
反转TOZERO(CV2.THRESH_TOZERO_INV)亮部置0,暗部保留 |
⭐⭐ |
均值滤波与方框滤波
| 核心内容 | 考试重点/易混淆点 | 难度系数 |
|---|---|---|
| 通过卷积核(如3×3)对像素邻域求均值,平滑噪声 | 归一化问题(需除以核大小避免越界) | ⭐⭐⭐ |
方框滤波(CV2.BOX_FILTER):类似均值滤波,但可选是否归一化 |
非归一化时越界处理(直接截断为255) | ⭐⭐⭐ |
注:表格中代码格式为行内代码(如CV2.THRESH_BINARY),无需代码块包装。
课时8:高斯与中值滤波
高斯滤波
基本原理函数特性
高斯函数以均值为中心,标准差决定曲线陡峭程度。当均值为零时,处的y值最大,表示离中心点越近的像素权重越大。
权重分配
不同于均值滤波的均匀分配,高斯滤波根据像素距离中心点的远近分配不同权重。例如中心点权重设为1,邻近点可设为0.8,较远点设为较小值。
实现方法
使用cv2.GaussianBlur(img, (5,5), 1),其中(5,5)表示卷积核大小,1为标准差参数。
效果对比
与均值滤波相比,高斯滤波能更好地保留边缘信息,噪声抑制效果更自然。例如处理lenaNoise.png时,椒盐噪声明显减弱但未完全消除。
与均值滤波的区别
均值滤波所有像素权重相等(如3×3核的每个位置都是1/9),高斯滤波权重按计算,中心点权重最大。
高斯滤波更适合处理服从正态分布的噪声,如高斯噪声;均值滤波对脉冲噪声效果较差。
方框滤波
基本特性
归一化选项normalize=True时等同于均值滤波,normalize=False时直接求和,易导致像素值溢出(超过255)。
函数原型cv2.boxFilter(img, -1, (3,3), normalize),其中-1表示输出图像深度与输入相同,(3,3)为核大小。
中值滤波

工作原理
核心操作是用邻域像素的中值代替中心像素值,例如对3×3区域排序后取第5个值。
优势
对椒盐噪声效果显著,能完全消除孤立的极值点。
函数调用cv2.medianBlur(img, 5),第二个参数必须为奇数。
核心原理
将滤波窗口内所有像素值排序后取中间值作为输出。例如对数值序列[24,75,78,104,113,121,154,204,235]排序后取中间值113。
实现方法
使用cv2.medianBlur()函数,需指定滤波器大小(如3×3或5×5)。5×5滤波器会处理25个像素值,取第13个排序值作为结果。
适用场景
特别适合处理椒盐噪声等离散噪声点,能完全消除明显离群值而不影响整体图像特征。
优势特点
不产生新的像素值(仅取已有值),保持边缘锐利度的同时去除噪声。
图像平滑展示

对比方法
使用np.hstack()水平拼接不同滤波结果图像,可替换为np.vstack()进行垂直拼接。
均值滤波
通过cv2.blur()实现,采用算术平均计算滤波窗口内像素值。
高斯滤波
通过cv2.GaussianBlur()实现,卷积核数值符合高斯分布,中心权重更高,参数包括滤波器大小和标准差σ。
效果观察
中值滤波对离散噪声消除效果最显著,高斯滤波能保持更好的图像细节,均值滤波会产生轻微模糊效果。
``典型输出格式示例
[[125 137 226]
[128 137 225]
[129 137 224]]
``
知识小结表格
| 知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 |
|---|---|---|---|
| 高斯滤波 | 基于高斯函数构造权重矩阵,离中心点越近的像素权重越高,体现“距离-重要性”关系 | 高斯函数参数(均值、标准差)与权重分配逻辑 | ⭐⭐ |
| 均值滤波 | 对滤波核内所有像素取算术平均值,无权重差异 | 公平性问题(忽略像素距离关系) | ⭐ |
| 中值滤波 | 取滤波核内所有像素值的中位数,有效消除椒盐噪声 | 排序计算中位数的实现逻辑 | ⭐⭐ |
| 滤波效果对比 | - 均值滤波:简单但易模糊边缘 - 高斯滤波:保留边缘但计算复杂 - 中值滤波:抗噪最强但可能丢失细节 |
适用场景选择(高斯:平滑渐变;中值:脉冲噪声) | ⭐⭐⭐ |
| 可视化方法 | 使用np.hstack()横向拼接不同滤波结果图像 |
多图对比时的矩阵维度匹配 | ⭐ |
课时9:腐蚀和膨胀操作
腐蚀操作
1. 读取图像
适用场景
腐蚀操作通常处理二值图像(黑白图像),背景为黑色(0值),前景为白色(255值)。典型问题包括去除前景物体边缘的毛刺,如示例中文字边缘的细小突起。
腐蚀函数
函数原型:cv2.erode(img, kernel, iterations=1)
效果表现:
- 去毛刺:消除细小突起(如文字笔画上的须状结构)
- 线条细化:使前景物体整体收缩变细
- 边界侵蚀:每次迭代都会使物体边界向内收缩一圈
卷积核
基本结构:通常使用全1矩阵(如3×3或5×5的np.ones((n,n), np.uint8))
工作原理:
- 核在图像上滑动时,若核覆盖区域存在背景像素(0值)则将核中心像素置为背景色(腐蚀效果)
- 全白区域(255值)保持原状
- 边界效应:越靠近边缘的点越容易被腐蚀,形成"层层向内"的腐蚀效果
核大小
尺寸影响:
- 大核(如30×30)会显著扩大腐蚀范围,单次操作可腐蚀更多像素
- 小核(如3×3)腐蚀效果精细,适合保留主体结构
选择原则: - 毛刺大小决定核最小尺寸
- 需保留的细节特征决定核最大尺寸
腐蚀次数
迭代特性:
- 每次迭代在前次结果基础上再次腐蚀
- 3次迭代相当于连续进行3次单次腐蚀
效果变化: - 迭代1次:去除最外层边缘
- 迭代2次:物体明显缩小
- 迭代3次:主体结构可能完全消失
参数建议:通常1-3次即可,需通过实验确定最佳次数
膨胀操作

定义
膨胀操作是形态学处理中与腐蚀相对应的操作,通过扩大图像中的前景区域来恢复被腐蚀操作削弱的有效信息。
效果:使图像中的目标物体变大,填补小的空洞和断裂。
膨胀函数
函数原型:cv2.dilate(src, kernel, iterations)
src:输入图像(通常是腐蚀后的结果)kernel:结构元素(如np.ones((3,3), np.uint8))iterations:膨胀次数
操作原理:当卷积核范围内存在白色像素时,中心像素将被置为白色。
膨胀与腐蚀的关系
逆运算关系:
-
腐蚀操作会使目标区域缩小(
cv2.erode) -
膨胀操作会使目标区域扩大(
cv2.dilate)
组合应用: -
先用腐蚀去除噪声/毛刺(如
iterations=1) -
再用膨胀恢复目标尺寸
实际效果:
-
原始图像线条变粗 → 腐蚀后变细 → 膨胀后恢复粗细
-
如演示中迪哥图像的线条变化过程
迭代次数影响
iterations=1:轻微膨胀iterations=2:明显扩张iterations=3:强烈膨胀(可能接近填满边界)
示例
- 使用30×30大核进行膨胀
- 通过
np.hstack横向对比不同迭代次数的效果
知识小节
腐蚀与膨胀操作对比表
| 操作类型 | 函数 | 核心参数 | 典型值 | 适用场景 |
|---|---|---|---|---|
| 腐蚀 | cv2.erode() |
iterations, kernel_size |
1-3次, 3×3/5×5 | 去除噪点/细化线条 |
| 膨胀 | cv2.dilate() |
iterations, kernel_size |
1-2次, 3×3 | 修复过度腐蚀/加粗线条 |
处理阶段效果对比表
| 处理阶段 | 迭代次数 | 可视化特征 | 数学表达 |
|---|---|---|---|
| 原始图像 | - | 完整圆形 | f(x,y)=255f(x,y)=255f(x,y)=255 |
| 首次腐蚀 | 1 | 边界内缩1px | f⊖kernelf \ominus kernelf⊖kernel |
| 二次腐蚀 | 2 | 半径缩小30% | (f⊖kernel)⊖kernel(f \ominus kernel) \ominus kernel(f⊖kernel)⊖kernel |
| 首次膨胀 | 1 | 边界外扩1px | f⊕kernelf \oplus kernelf⊕kernel |
操作原理与参数影响表
| 知识点 | 核心内容 | 关键操作/参数 | 效果对比 |
|---|---|---|---|
| 腐蚀操作原理 | 通过卷积核侵蚀白色区域边界 | cv2.erode() |
核大小:3×3, 迭代次数=1 → 消除毛刺线条变细 |
| 腐蚀效果控制 | 迭代次数对腐蚀程度的影响 | 迭代次数=2时线条显著变细 | 迭代次数=3时基本消失 |
| 膨胀操作原理 | 通过卷积核扩张白色区域 | cv2.dilate() |
核大小:3×3 → 恢复线条粗细/补偿腐蚀损失 |
| 形态学组合应用 | 先腐蚀后膨胀的完整流程 | 1. 腐蚀去噪 2. 膨胀修复 | 去毛刺同时保持原线条特征 |
| 卷积核影响 | 核尺寸对操作效果的影响 | 大核:强腐蚀/膨胀 | 3×3核 vs 5×5核效果对比 |
| 课时10:开运算与闭运算+梯度运算+礼帽和黑帽 |
开运算与闭运算

开运算
定义:将腐蚀和膨胀操作按特定顺序组合的形态学操作。
执行顺序:先腐蚀后膨胀。
核心作用:消除细小毛刺同时保持主体形状。
腐蚀阶段:消除图像中的细小噪声和毛刺(缩小特征)。
膨胀阶段:恢复主体结构的原始尺寸(恢复轮廓)。
典型应用:处理带有毛刺边缘的图像。
代码实现:
import cv2
import numpy as np
kernel = np.ones((5,5), np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
效果验证:通过对比原始图像和处理后图像,可观察到毛刺消失而主体线条宽度不变。
闭运算

定义:与开运算顺序相反的形态学操作组合。
执行顺序:先膨胀后腐蚀。
核心特点:无法消除已有毛刺(膨胀会放大原有毛刺),会使主体线条略微变粗(特征强化)。
代码实现:
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
与开运算对比:
- 顺序差异:开运算是先腐蚀后膨胀,闭运算是先膨胀后腐蚀。
- 效果差异:开运算消除毛刺,闭运算填充小孔。
- 适用场景:开运算适合去噪,闭运算适合连接断裂部分。
参数说明:
- 核大小(kernel)影响操作强度,如(5,5)的核比(3,3)作用更明显。
- 可通过调整核大小和迭代次数控制处理效果。
梯度运算
膨胀腐蚀核函数设置

使用7×7的核(kernel = np.ones((7,7), np.uint8))对图像进行5次迭代处理。
- 膨胀效果:图像会"变胖一圈",即白色区域扩大。
- 腐蚀效果:图像会"变瘦一圈",即白色区域缩小。
- 处理顺序:膨胀和腐蚀没有先后顺序要求,都是对原始图像分别进行的独立操作。
梯度运算的定义

数学原理:梯度 = 膨胀结果 - 腐蚀结果。
边界提取:通过膨胀后的"胖图像"减去腐蚀后的"瘦图像",可以得到物体轮廓。
运算本质:实际上是计算图像中白色区域的边界宽度。
颜色表现:相同白色区域相减会变黑,差异部分(边界)保持白色。
梯度运算示例

API使用:通过cv2.morphologyEx()函数,操作类型设为cv2.MORPH_GRADIENT。
参数说明:
- 第一个参数:原始图像(如
pie.png)。 - 第二个参数:运算类型(
GRADIENT)。 - 第三个参数:核函数(与膨胀腐蚀使用相同的7×7核)。
便捷性:OpenCV提供了直接计算梯度的封装方法,无需手动实现膨胀-腐蚀相减。
在这里插入图片描述
可视化效果:最终输出的是物体的轮廓信息,表现为白色边界线。
应用场景:常用于图像分割、边缘检测等需要提取物体边界的场合。
礼帽与黑帽

礼帽
定义:礼帽(Top Hat)= 原始输入 - 开运算结果。
原理:开运算先腐蚀再膨胀会去除图像中的"刺儿"(细小噪声),原始输入减去开运算结果就只剩下这些被去除的"刺儿"。
效果展示:以图像为例,礼帽处理后原文字消失,仅保留文字边缘的细小噪声。
OpenCV实现:
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
黑帽

定义:黑帽(Black Hat)= 闭运算结果 - 原始输入。
原理分析:闭运算先膨胀再腐蚀会保留并增强图像中的"刺儿",用闭运算结果减去原始输入(也含"刺儿"),"刺儿"相减抵消,最终保留图像主体轮廓。
效果对比:与礼帽相反,黑帽处理后"刺儿"消失,保留文字主体轮廓。
OpenCV实现:
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat', blackhat)

应用选择
- 礼帽:突出细小噪声/边缘。
- 黑帽:突出主体轮廓。
- 开运算:去噪。
- 闭运算:连接断裂部分。
完整形态学体系
- 基础操作:腐蚀(变小)、膨胀(变大)。
- 组合操作:开运算(先腐蚀后膨胀)、闭运算(先膨胀后腐蚀)。
- 衍生操作:梯度运算(膨胀-腐蚀)、礼帽、黑帽。
形态学操作知识小结
| 知识点 | 核心内容 | 关键操作 | 效果对比 | 难度系数 |
|---|---|---|---|---|
| 开运算 | 先腐蚀后膨胀的组合操作 | cv2.morphologyEx(open) |
消除毛刺同时保持主体轮廓 | ★★☆☆☆ |
| 闭运算 | 先膨胀后腐蚀的组合操作 | cv2.morphologyEx(close) |
填充细小孔洞但可能扩大毛刺 | ★★☆☆☆ |
| 梯度运算 | 膨胀结果减腐蚀结果 | cv2.morphologyEx(gradient) |
提取物体边界轮廓 | ★★★☆☆ |
| 礼帽运算 | 原始输入减开运算结果 | cv2.morphologyEx(tophat) |
突出明亮细节(如文字笔画) | ★★★☆☆ |
| 黑帽运算 | 闭运算结果减原始输入 | cv2.morphologyEx(blackhat) |
突出暗部细节(如背景噪点) | ★★★☆☆ |
| 腐蚀操作 | 消除边界像素 | cv2.erode() |
缩小物体/消除细小结构 | ★☆☆☆☆ |
| 膨胀操作 | 扩展边界像素 | cv2.dilate() |
扩大物体/连接断裂部分 | ★☆☆☆☆ |
更多推荐
所有评论(0)