- 主要讲解了 OpenCV 的各种开发环境的配置,其中以Sublime 作为主要的配置环境的介绍,这里我们主要使用 VScode 进行开发。
第二章 图像及视频的基本操作
- 图像基本类库 Mat 的基本操作
- Mat 的基本操作:
- Mat::row 、Mat::col
- Mat::rowRange 、Mat::colRange
- Mat::clone 、Mat::copyTo
- Mat::convertTo
- Mat::zeros 、Mat::ones
- Mat::channels
- Mat::empty 、Mat::at
- 图像的读取、显示、保存
- 图像存储
- 视频基本类库 VideoCapture 的基本操作
- 常见函数:
- VideoCapture::open
- VideoCapture::isOpened
- VideoCapture::release
- VideoCapture::grab
- VideoCapture::retrieve 解码并返回视频帧
- VideoCapture::read
- VideoCapture::get 返回指定视频的相关参数信息
- VideoCapture::set
- 视频写操作 VideoWrite
- 常见函数
* open 、write
- 视频质量评价 :图像的相似度
- 峰值信噪比 PSNR 用于图像压缩中的信号重建的测量方法
- 结构相似性 SSIM
- 图像的几何变换
- 坐标映射 remap
- 平移
- 缩放
- 等间隔提取图像缩放
- 区域字块提取图像缩放
- 旋转
- 翻转 transpose 、filp
- 仿射变换
- 在空间坐标系中将一个二维坐标转换成另一个二维坐标
- 图像的基本应用操作
- 界面事件
- 程序界面中的鼠标及键盘事件
- 如:setMouseCallback(WinNameString,MouseCallBack,userData)
- 其中回调函数形式为 void Fun(int event,int x,int y,int flags,void *param)
- 其中,上面的 event 是 enum 的数值
- CV\_EVENT\_MOUSEMOVE =0,
- CV\_EVENT\_LBUTTONDOWN =1,
- CV\_EVENT\_RBUTTONDOWN =2,
- CV\_EVENT\_MBUTTONDOWN =3,
- CV\_EVENT\_LBUTTONUP =4,
- CV\_EVENT\_RBUTTONUP =5,
- CV\_EVENT\_MBUTTONUP =6,
- CV\_EVENT\_LBUTTONDBLCLK =7,
- CV\_EVENT\_RBUTTONDBLCLK =8,
- CV\_EVENT\_MBUTTONDBLCLK =9,
- CV\_EVENT\_MOUSEWHEEL =10,
- CV\_EVENT\_MOUSEHWHEEL =11
- 区域提取,提取出你感兴趣的部分
- 1、使用cv::Rect 选择 + copyTo 复制
- 2、利用鼠标左右键标志位控制选择区域
- 图像元素遍历 — 反色
- 由于对于图像像素比较之多,于是遍历算法就有一定的好坏之分,这里介绍如下几种:
- Mat 提供的函数模板 Mat::at
- 指针遍历 Mat::ptr Mat 的函数模板
- 使用 Mat 数据操作的迭代器MatIterator_
- 使用 Mat 的isContinuous 判断是否连续存储,在讲图像看成一行,按行展开
- LUT (Look Up Table)查表法,可以减少图像映射的时间复杂度(可用于替换、反转、赋值、阈值、二值化、灰度变化)
- 单窗口显示多幅图像
- 图像颜色空间转换 cvtColor
- 图像批量读取
- 文件名连续规则,可用 sptintf 函数
- 文件名不规则,可用 VC 下 WIN32_FIND_DATA 文件的读取方式进行
第二部分 图像处理技术
第三章 图像灰度变换技术
涉及到图像灰度变换技术、阈值化操作、直方图相关操作及其应用及 Gamma 校正、线性、对数及分段线性变换技术、灰度变换应用实例:最大熵阈值分割与投影峰谷查找
- 阈值化处理
- OTSU 阈值化
- 固定阈值化 threshold
- 自适应阈值化 adaptiveThreshold
- 双阈值化
- 半阈值化
- 直方图处理
- 灰度直方图
- H-S 直方图
- BGR 直方图
- 自定义直方图
- 灰度直方图均衡
- 彩色直方图均衡
- 直方图变换 — 查找
- 直方图变换 — 累计
- 直方图匹配
- 直方图对比
- 相关系数
- 卡方系数
- 相交系数
- 巴氏系数
- 直方图反向投影
- 距离变换
- 介绍 距离、邻接性、区域 的概念
- 距离变换 — 扫描
- 距离变换 — OpenCV 提供的 distanceTransform
- Gamma 校正: 是一种非线性变换,对输入的图像灰度值进行指数变换,进而校正亮度偏差,常用于扩展暗调的细节。当Gamma校正的值大于 1 时,高光部分被压缩而暗调部分被扩展。小于 1 时,反之。
- 常见的灰度变换技术
- 线性变换
- 对数变换
- 对比度拉伸
- 灰度级分层
- 灰度比特平面
- 实例应用
- 最大熵阈值分割
- 投影峰谷查找
第四章 图像平滑技术
涉及到图像采样常用操作:最近邻、双线性、及金字塔。傅里叶变换与卷积、图像典型噪声:椒盐和高斯、常用的空间滤波方式:均值、中值、高斯及双边滤波。图像平滑技术应用:导向滤波、污点修复及旋转文本校正
- 图像采样: 上采样是讲图像分辨率扩大,下采样是将图像的分辨率缩小。
- 最邻近插值
- 双线性插值,应用广泛,稳定性高且时间复杂度较优
- 图像金字塔:是一系列图像的集合,所有多个分辨率图像来自同一个原始图像。常用于图像的缩放或图像分割。
- 向下采样 — 高斯金字塔
- 向上采样 — 拉普拉斯金字塔
- 傅里叶变换
- 图像掩码操作:通过掩码核算子重新计算每个像素的值。
- 基于像素邻域遍历
- 基于 filter2D 函数
- 离散傅里叶:将时域信号分解为不同频率的正弦波或余弦信号叠加之和。
- 图像卷积
- 图像噪声
- 椒盐噪声
- 高斯噪声
- 空间平滑
- 盒滤波
- 均值滤波
- 中值滤波
- 高斯滤波
- 双边滤波
- 实际应用
- 导向滤波:不仅能实现双边滤波的边缘平滑,而且在检测到边缘附近有较好的表现,可应用于图像增强、HDR压缩、图像抠图、及图像去雾等场景。
- 图像污点修复:用来解决小区域污染以重构原始图像,如:去除文本和Logo图标等场景中,利用重构去除图像中的划痕和污点。
- 旋转文本图像矫正,由于扫描仪扫描时未按照行列水平垂直扫描的现象。
第五章 边缘检测技术
边缘检测算子:Sobel、Laplace、Roberts、Prewitt、Canny 及 Marr-Hildreth。 几何检测,霍夫变换。轮廓检测及提取、角点检测技术、边缘检测应用实例:;颜色圆检测与车牌疑似区域点检测
- 边缘检测目的是检测识别出图像中亮度变化剧烈的像素点构成的集合。图像边缘的正确检测有利于分析目标检测、定位及识别。
- 根据边缘形成的原因,对图像进行求微分或者二阶微分可以检测出灰度变化明显的点。边缘检测大大减少了源图像的数据量,保留了图像的重要特征。常见的边缘检测分如下三种方式:
- 一阶微分为基础的边缘检测,Sobel算子、Prewitt算子、Roberts算子及差分边缘检测
- 二阶微分为基础的边缘检测,拉普拉斯算子、高斯算子、Canny算子边缘检测、
- 结合一阶与二阶微分为基础的边缘检测。
- 图像差分运算
- 非极大值抑制:可以剔除伪边缘信息。
- Sobel 算子
- 效率高。当精度要求不是很高时,可选用。它对于沿x 轴和y 轴的排列表示的较好,但是对于其他角度表示的不够精确。这时可以使用Scharr滤波器。
- 非极大值抑制 Sobel 检测
- 图像直接卷积实现 Sobel
- 图像卷积下非极大值抑制 Sobel
- 基本边缘检测算子 — Laplace:它是最简单的向同性的二阶微分算子,具有旋转不变性。根据函数微分特性可知,该像素点值的二阶微分为零的点为边缘点。
- 基本边缘检测算子 — Roberts 利用局部差分寻找边缘的一种算子,是最为简单的边缘检测算子。Roberts 算子利用对角线方向相邻两像素之差近似梯度幅值来检测边缘,检测垂直边缘效果好于其他方向,定位精度高,但对噪声的抑制能力差。
- 基本边缘检测算子 — Prewitt:它对噪音有抑制作用,原理和 Sobel 相似。都是在图像方向利用两个方向模板与图像进行邻域卷积完成,分别对水平和垂直方向边缘进行检测。准确性不如 Sobel 算子。
- 改进边缘检测算子 — Canny
- 原理是通过图像信号函数的极大值来判定图像的边缘像素点,性能较好。
- 最优边缘检测的评价标准有下面三个:
- 低错误率
- 高定位性
- 最小响应
- Canny 的原理及实现
- 消除噪声:由于导数通常对噪声很敏感。故边缘检测算法常常需要根据图像源数据进行预处理操作。必须利用滤波器来改善与噪音相关的边缘检测性能。常常先对原始数据与高斯模板进行卷积操作,得到的图像与原始图像相比有些轻微的模糊。即使用高斯平滑滤波器卷积降噪。
- 计算梯度幅值与方向。
- 非极大值抑制
- 用滞后阈值算法求解图像边缘
- 改进的边缘检测算子 — Marr–Hildreth
- 用于解决边缘检测的核心问题 — 定位精度与抑制噪声。它以高斯函数作为平滑算子,结合拉普拉斯算子提取二阶导数的零交叉理论进行边缘检测。称为LoG 函数,有被称为墨西哥草帽算子。
- 几何检测
- 霍夫变换:是从图像中识别几何形状的基本图像处理方法之一,应用广泛。经典的霍夫变换用来检测图像中的直线。改进的霍夫变换可以扩展到识别任意形状的物体。它不受图像旋转的影响,易于进行稽核图形的快速变换。
- 线检测技术
- LSD 快速直线检测,OpenCV3.0提供了 cv::LineSegmentDetector
- 形状检测
- 轮廓检测
- 凸包检测:是计算几何图像学中的概念,凸包就是将最外层的点连接起来构成凸多边形,它能包含点集中的所有点。物体的凸包检测常用于物体识别、手势识别及边界检测等领域。
- 轮廓边界框:物体轮廓检测出来后,我们常常会根据物体形态进行边界提取,常用的边界提取有矩形框、圆形框、椭圆形框等。
- OpenCV中提供了大量的轮廓、边缘及边界检测相关函数。
- approxPolyDP() 表示对多边形曲线做近似
- boundingRect() 表示计算并返回保卫轮廓点集中的最小矩阵;
- 函数 minEnclosingCircle()表示计算完全包围以有轮廓最小圆;
- 函数 minAreaRect() 表示计算二维点集形成封闭、倾斜、及最小面积的矩阵
- fitEllipse() 表示符合椭圆点集生成
- 轮廓矩:图像矩是通过对轮廓上所有的点进行积分运算而得到的一个粗略的特征。
- 点多边形测试:它用来判断点集是否在被测试多边形的内部,是轮廓点集判断的重要技术点之一。
- 角点检测
- moravec 角点
- harris 角点
- Shi-Tomasi 角点
- 实例应用
- 颜色圆检测
- 我们遇到的图像一般是真彩色图像,检测圆目标时常带着颜色信息,霍夫变换圆检测在颜色圆检测中主要解决两个问题:
- 检测输入函数集的所有圆,进行形状区分
- 尝试对颜色通道阈值化处理,分离特殊颜色圆
- 车牌区域检测
第六章 形态学技术
主要讨论:腐蚀和膨胀操作、开闭运算操作和实现、形态学梯度操作、形态学TOP-Hat、形态学应用实例:角点提取与车牌区域检测
数学形态学是基于集合论的图像处理方法,在图像中的形态学操作用于图像的预处理操作(去噪、形态简化)、图像增强(骨架提取、细化、凸包及物体标记)、物体背景分割及物体形态量化等场景,数学形态学利用点集的性质、积分几何集及拓扑学理论对物体像素集进行变换。
- 腐蚀膨胀操作
- 形态学膨胀操作,实现了对目标像素点进行扩展。
- 形态学腐蚀可以看成是膨胀的逆操作,腐蚀对原区域缩小。
- OpenCV 中提供了 erode() 和 dilate() 函数用于形态学腐蚀和膨胀操作。
- 开闭运算操作
- 形态学开操作能去除噪音及平滑目标边界。先对图像进行腐蚀操作,然后再进行膨胀操作。机构元素各向同性的开运算操作主要用于消除图像中小于结构元素的细节部分,物体局部形状不变。
- 形态学闭操作能填充目标区域内的离散小空洞和分散部分,先用结构元素 B 对 A 进行膨胀,然后再进行腐蚀。能够排除小型黑洞,消除低于邻近点的孤立点,达到去噪的作用,可以平滑物体轮廓。
- OpenCV 中提供了 morphologyEx 函数用于形态学开闭操作。
- 形态学梯度
- 梯度主要用于刻画目标边界或边缘位于图像灰度级别剧烈变化的区域,形态学梯度根据膨胀或腐蚀与原图像作差组合来实现增强结构元素邻域中像素的强度,突出高亮区域的外围。
- 形态学 Top-Hat :指形态学顶帽操作与黑帽操作,前者是计算原图像与开运算结果图之差,后者是计算闭运算结果图与原图像之差,是一种常见的形态学滤波器,具有高通滤波器的某部分特性,可是想在图像中检测出周围背景亮结构或周围背景暗结构。顶帽常用于检测图像中的峰结构,黑猫常用于检测图像中的波谷结构。
- 实例应用:
- 形态学滤波角点提取:利用膨胀与腐蚀变化区域特征来完成边缘检测,膨胀是将目标物体向周围邻域扩展,而腐蚀是收缩,故将膨胀与腐蚀得到的结构图进行作差运算,就可以得到物体的边缘。在进行阈值化处理即可。
- 车牌目标提取