课时1:python和opencv配置安装_笔记
一、课程安排与介绍
在这里插入图片描述

  • 教学风格:采用通俗易懂的讲解方式,用生活化语言解析复杂概念
  • 课程结构:采用"理论+实践"的教学模式,每学完几个知识点配套一个实战项目
  • 难度梯度:从零基础到进阶,前期学习计算机视觉基础操作和OpenCV函数,后期完成大型项目
  • 学习基础:需掌握Python基础语法(无需精通),课程全程使用Python实现
  • 配套资源:提供完整课程资料和代码,并持续更新维护

二、环境配置

  1. Anaconda安装
  • 功能特点
    • 集成Python环境、包管理工具和开发工具
    • 包含Conda包管理器(支持1400+数据科学包)
    • 内置Jupyter Notebook交互环境
  • 安装优势
    • 一键安装,自动配置环境变量
    • 智能解决依赖关系
    • 支持多Python版本管理
  • 下载安装
    • 官网下载:https://www.anaconda.com/download/
    • 选择对应系统版本(Windows/macOS/Linux)
    • 推荐Python 3.7版本(64位安装包)
    • 运行安装程序,默认设置完成安装
  1. OpenCV安装
    在这里插入图片描述

    • 准备工作:确保已安装Python环境(推荐Anaconda)

    • 版本建议:opencv-python==3.4.1.15(3.4.2+版本存在功能限制)

    • 安装步骤

      1. 打开Anaconda Prompt
      2. 执行:pip install opencv-python==3.4.1.15
      3. 安装扩展包:pip install opencv-contrib-python==3.4.1.15
        在这里插入图片描述
    • 验证方法

      • Python命令行执行import cv2
      • 检查版本号:cv2.__version__应为3.4.1
    • 注意事项

      • 可切换国内镜像源加速安装
      • 确保基础包和扩展包版本一致
      • 建议先测试导入成功再开发

三、知识小结

分类维度 核心内容 关键要点
课程定位 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 可能存在兼容问题)
  • 安装流程
    1. 下载匹配的 .whl 文件
    2. 复制到 Scripts 目录
    3. 执行 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)
    • 实时变量查看
    • 便于分步调试

四、环境配置建议

在这里插入图片描述

  1. 基础环境

    • Anaconda下载:官网获取
    • whl文件站点:UCI镜像库
    • IDE选择:推荐支持debug的环境(如PyCharm/Eclipse)
  2. 版本推荐

    • OpenCV 3.4.1.15(规避专利限制)
    • 安装顺序:先配Python环境,再装OpenCV
  3. 工具分工

    • 理论演示: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库,读取格式为BGR
  • import matplotlib.pyplot as plt:绘图展示
  • import numpy as np:数值计算

魔法指令:%matplotlib inline用于在Jupyter中自动显示图像,无需调用plt.show()
读取函数:cv2.imread('filename')从当前路径读取图像,返回numpy数组结构。

示例代码:
在这里插入图片描述

  • 数据结构:读取结果为ndarray结构,dtypeuint8(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区域_笔记

  1. 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()读取图像,返回numpyndarray结构

图像加法运算:
在这里插入图片描述

逐像素加法:对图像每个像素点进行数值加法,如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(黑色);像素值 ≤ 阈值 → 保持不变
  • 特点:保留暗部,抑制亮部。

图像平滑处理

在这里插入图片描述

均值滤波
  1. 例题:阈值图像展示
    在这里插入图片描述
    噪声特点:图像中包含明显的椒盐噪声(黑白噪点)
    处理目标:通过滤波操作去除噪声点
方框滤波

在这里插入图片描述

  • 与均值滤波关系: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 kernelfkernel
二次腐蚀 2 半径缩小30% (f⊖kernel)⊖kernel(f \ominus kernel) \ominus kernel(fkernel)kernel
首次膨胀 1 边界外扩1px f⊕kernelf \oplus kernelfkernel

操作原理与参数影响表

知识点 核心内容 关键操作/参数 效果对比
腐蚀操作原理 通过卷积核侵蚀白色区域边界 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() 扩大物体/连接断裂部分 ★☆☆☆☆
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐