- 《OpenCV编程实例代码》各章重点知识点简述
- 第一章 OpenCv环境配置
- 第二章 图像及视频的基本操作
- 第二部分 图像处理技术
- 第三章 图像灰度变换技术
- 第四章 图像平滑技术
- 第五章 边缘检测技术
- 第六章 形态学技术
- 第三部分 图像应用技术
- 第七章 图像分割技术
- 第八章 特征分析
- 第九章 复杂视频处理技术
《OpenCV编程实例代码》各章重点知识点简述
第一章 OpenCv环境配置
- 主要讲解了 OpenCV 的各种开发环境的配置,其中以Sublime 作为主要的配置环境的介绍,这里我们主要使用 VScode 进行开发。
第二章 图像及视频的基本操作
- 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
- 视频质量评价 :图像的相似度
- 峰值信噪比 PSNR 用于图像压缩中的信号重建的测量方法
- 结构相似性 SSIM
- 图像的几何变换
- 图像的基本应用操作
- 界面事件
- 程序界面中的鼠标及键盘事件
- 如: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 时,反之。
- 常见的灰度变换技术
- 线性变换
- 对数变换
- 对比度拉伸
- 灰度级分层
- 灰度比特平面
- 实例应用
第四章 图像平滑技术
涉及到图像采样常用操作:最近邻、双线性、及金字塔。傅里叶变换与卷积、图像典型噪声:椒盐和高斯、常用的空间滤波方式:均值、中值、高斯及双边滤波。图像平滑技术应用:导向滤波、污点修复及旋转文本校正
- 图像采样: 上采样是讲图像分辨率扩大,下采样是将图像的分辨率缩小。
- 最邻近插值
- 双线性插值,应用广泛,稳定性高且时间复杂度较优
- 图像金字塔:是一系列图像的集合,所有多个分辨率图像来自同一个原始图像。常用于图像的缩放或图像分割。
- 向下采样 — 高斯金字塔
- 向上采样 — 拉普拉斯金字塔
- 傅里叶变换
- 图像掩码操作:通过掩码核算子重新计算每个像素的值。
- 离散傅里叶:将时域信号分解为不同频率的正弦波或余弦信号叠加之和。
- 图像卷积
- 图像噪声
- 空间平滑
- 实际应用
- 导向滤波:不仅能实现双边滤波的边缘平滑,而且在检测到边缘附近有较好的表现,可应用于图像增强、HDR压缩、图像抠图、及图像去雾等场景。
- 图像污点修复:用来解决小区域污染以重构原始图像,如:去除文本和Logo图标等场景中,利用重构去除图像中的划痕和污点。
- 旋转文本图像矫正,由于扫描仪扫描时未按照行列水平垂直扫描的现象。
第五章 边缘检测技术
边缘检测算子:Sobel、Laplace、Roberts、Prewitt、Canny 及 Marr-Hildreth。 几何检测,霍夫变换。轮廓检测及提取、角点检测技术、边缘检测应用实例:;颜色圆检测与车牌疑似区域点检测
第六章 形态学技术
主要讨论:腐蚀和膨胀操作、开闭运算操作和实现、形态学梯度操作、形态学TOP-Hat、形态学应用实例:角点提取与车牌区域检测
数学形态学是基于集合论的图像处理方法,在图像中的形态学操作用于图像的预处理操作(去噪、形态简化)、图像增强(骨架提取、细化、凸包及物体标记)、物体背景分割及物体形态量化等场景,数学形态学利用点集的性质、积分几何集及拓扑学理论对物体像素集进行变换。
- 腐蚀膨胀操作
- 形态学膨胀操作,实现了对目标像素点进行扩展。
- 形态学腐蚀可以看成是膨胀的逆操作,腐蚀对原区域缩小。
- OpenCV 中提供了 erode() 和 dilate() 函数用于形态学腐蚀和膨胀操作。
- 开闭运算操作
- 形态学开操作能去除噪音及平滑目标边界。先对图像进行腐蚀操作,然后再进行膨胀操作。机构元素各向同性的开运算操作主要用于消除图像中小于结构元素的细节部分,物体局部形状不变。
- 形态学闭操作能填充目标区域内的离散小空洞和分散部分,先用结构元素 B 对 A 进行膨胀,然后再进行腐蚀。能够排除小型黑洞,消除低于邻近点的孤立点,达到去噪的作用,可以平滑物体轮廓。
- OpenCV 中提供了 morphologyEx 函数用于形态学开闭操作。
- 形态学梯度
- 梯度主要用于刻画目标边界或边缘位于图像灰度级别剧烈变化的区域,形态学梯度根据膨胀或腐蚀与原图像作差组合来实现增强结构元素邻域中像素的强度,突出高亮区域的外围。
- 形态学 Top-Hat :指形态学顶帽操作与黑帽操作,前者是计算原图像与开运算结果图之差,后者是计算闭运算结果图与原图像之差,是一种常见的形态学滤波器,具有高通滤波器的某部分特性,可是想在图像中检测出周围背景亮结构或周围背景暗结构。顶帽常用于检测图像中的峰结构,黑猫常用于检测图像中的波谷结构。
- 实例应用:
- 形态学滤波角点提取:利用膨胀与腐蚀变化区域特征来完成边缘检测,膨胀是将目标物体向周围邻域扩展,而腐蚀是收缩,故将膨胀与腐蚀得到的结构图进行作差运算,就可以得到物体的边缘。在进行阈值化处理即可。
- 车牌目标提取
第三部分 图像应用技术
第七章 图像分割技术
图像分割是在进行图像分析时需要获取图像中某些感兴趣的部分。它利用图像的特征灰度、颜色、纹理和形状将具有独特特征的区域进行划分。根据分割的成因可分为连续分割和非连续分割。连续分割是指将具有同一灰度或相同特征的像素划分成不同的区域,有区域生成、阈值分割及聚类分割等。非连续分割是利用像素值突变特性来呈现不同边界区域以实现图像分割,常见的有点线检测、边缘及能量等。
本章主要要探讨的内容有分水岭原理及其实现、FloodFill 分割技术、均值漂移 meanShift、Grabcut图割技术、图像分割应用实例:奇异区域检测与肤色检测
- 分水岭分割
- 分水岭分割是基于模拟水流通过地形起伏的现象从而研究总结出的一种分割方法,其基本原理是将图像特征看作地理上的地貌特征,利用像素的灰度值分布特征,对每个符合特征的区域进行划分,形成边界以构成分水岭。
- 对于分水岭算法中的图像像素点,一般关注下面三个特征点:
- 分水岭算法是一种很好的分割相互接触的物体图像的方式,但在边缘分割时精度存在一定问题。实际应用场景中,存在噪声或者其他干扰信息会导致局部极值点过多,就无法实现图像分割。
- 分水岭分割合并:首先计算分割部分的像素归属,利用直方图信息统计相关特征,对每个分割部分统计直方图对比的相似性,然后根据相似性判断分割的两个部分是否需要合并成一个区域。
- FloodFill 分割:泛洪填充算法,通常来说是自动选中与种子像素相关的区域,利用指定的颜色进行区域颜色替换,可用于标记或分离图像的某些部分。如 Windows 的油漆桶和Phottoshope 的魔术棒都是用它来改进和延伸的。
- FloodFill 算法原理很简单,就是从一个点开始遍历附近像素点,填充成新的颜色,直到封闭区域内的所有像素点都被填充成新颜色为止。它常见的有 4 邻域像素填充法、8邻域像素填充法、基于扫描线的像素填充方法。
- 均值漂移 MeanShift: 是一种核密度估计方法,用来分析复杂多模特征空间,其算法本质是最优化理论中的梯度下降法,沿着梯度下降方法寻找目标函数的极值。图像分割是找到每个像素点所属类中心,均值漂移认为类中心是概率密度的极大值点。对于任一像素沿着梯度方向总能找到其极值点。算法实现如下:
- 平滑 Mask 点搜索
- mask 点聚类
- 合并相似小区域
- 图割 Graphcut 是一种基于图论的分割方法,应用于前背景色分割、医学处理、纹理分割及立体视觉等方面。Grabcut是其改进算法。
- Graphcut 的目标和背景模型是灰度直方图,的能量最小化分割是通过一次计算实现的,需要输入前景与背景区域点集。
- Grabcut 采用的是 RGB 三通道混合高斯模型,根据分割模型参数更新完成的学习过程;只需要提供含有背景的区域像素集就可完成分割。
- 实例实践
- 1、奇异区域检测:通常是指与周围邻域有着某些特征(颜色或灰度) 差别的区域。常见的奇异区域如医学领域 X 光照片或 CT 某些特定组织、天空中降落等,奇异区域相对于点区域检测更稳定,在目标分割及检测、图像配准、特征分析等领域有广泛的应用。
- 计算机视觉中我们常常关注的目标特征是颜色和灰度,刻画图像中两个区域的视觉相似性有许多方法,如形状描述子、颜色特征、距特征等。
- 奇异区域检测主要是通过微分检测或局部极值的分水岭算法实现。基于图像中的奇异区域的邻域像素值或大或小的特征,我们可以通过计算图像中的局部极值点来实现相应兴趣区域的检测。一般实现奇异区域检测有如下两种方法:
- 基于微分检测器检测。拉普拉斯算子是检测图像奇异区域常用的方法,二维高斯经过拉普拉斯变换后的到。图像与高斯拉普拉斯函数进行卷积操作实际上求取的是图像与这一函数的相似性,奇异区域表现出来的特征就是图像中呈现比它周围像素灰度值大或小的区域,二维高斯拉普拉斯变换呈现出的就是这种特性。一般用它检测图像局部极值点时,需要先对图像进行低通滤波,去除伪点噪声。
- 基于局部极值的分水岭检测。局部极值的分水岭检测奇异区域是对原图像进行多间隔区域二值化操作,对一个二值化图像提取相应的连通域并计算相应区域的连通中心;根据中心点拟合归类成同一块 group,得到对应的 blob 特征;最后根据得到的中心点集group 估计出 blob 特征和对应的半径。
- 2、肤色检测
- 肤色检测利用了计算机对人体皮肤像素的分析过程,随着人脸检测技术、表情识别、手势识别等技术的快速发展,肤色应用的领域日益增多,它常用的方法有基于颜色空间、光谱特征、及肤色反射模型。这些方法主要步骤是先进行颜色空间变换,然后再建立肤色模型。颜色空间有 RGB、YCrCb、HSV和Lab等。皮肤模型中有单高斯模型、混合模型、贝叶斯模型和椭圆模型等,高斯分布模型用于刻画椭圆高斯概率,对肤色与非肤色采用高斯混合模型在特定的区域内能取得较好的实验效果。
- 其中 YCbCr 颜色空间是一种常见的肤色检测的色彩模型,其中 Y 代表亮度,Cr代表光源中的红色分量,Cb 代表光源中的蓝色分量。
第八章 特征分析
本章主要探讨以下内容:尺度空间相关基本概念、常见的特征描述子 SIFT、SURF 及 ORB、方向梯度直方图 HOG 提取及特征描述、局部二值模式 LBP 提取及实现、Haar特征提取及实现、特征分析应用实例:最近邻特征点目标提取、MSER 检测、字符特征提取及车牌字符 SVM 训练
注: 此均为笔者辛苦整理,如果对您有帮助,还望去点一个赞,留下你的脚步,以便激励笔者以后分享更加有干货的技术文章,谢谢您的理解 ~ ~ ~
所对应的代码在此,链接:https://pan.baidu.com/s/1LdTlCvwmJNy3G3e1oGVUaA
密码:9n70