OpenCV学习笔记(一) 基本概念和函数

开篇:
本文内容来源于毛星云所著的《opencv3编程入门》!
最近刚接触机器视觉这一块,自己也是个小白,在网上找资料学习,写博客主要是作为个人笔记,也方便有需要的人可以阅读。由于知识水平有限难以保证博文的准确性,仅供参考,欢迎指正。如果有类似经历或想法的可以联系我一起学习。

认知准备

光流(optical flow)法是目前运动图像分析的重要方法,物体运动时图像上对应的点的亮度模式也在运动,这种图像亮度模式的表观运动就是光流,其表达了图像变化,包含了目标运动信息。

带有形参的main函数:

int argc 表示命令行字串(参数)的个数

char *argv[ ] 表示命令行参数的字符串

注:由于常使用VS作为开发环境,在opencv相关代码遇到该参数时,可以用路径字符串替换,或者在项目属性页赋值,影响不大可考虑注释掉。

Mat类使用

①opencv函数中输出图像的内存分配是自动完成的。

②使用opencv的c++接口时不需要考虑内存释放问题

③赋值运算符和拷贝构造函数只赋值信息头

④使用函数clone()或者copyTo()来复制一幅图像的矩阵

 

图像处理之滤波

方框滤波(box Filter):第六个参数为normalize,当normalize=true(默认)时,即为均值滤波;而非归一化的方框滤波用于计算每个像素领域内的积分特性。

双边滤波(Bilateral filter):结合图像的空间邻近度和像素值相似度的一种折中处理,达到保边去噪的目的。

 

 

图像处理之形态学

一、膨胀(dilate)和腐蚀(erode)

功能主要如下:

①消除噪声

②分割(isolate)出独立的图像元素;在图像中连接(join)相邻的元素

③寻找图像中的明显的极大值区域和极小值区域

④求出图像的梯度

注:腐蚀和膨胀是对白色(高亮)部分而言的,不是黑色部分。

二、开/闭运算、形态学梯度、顶/黑帽

开运算:是先腐蚀后膨胀的过程,可以用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时不明显改变其面积。

闭运算:是先膨胀后腐蚀的过程,能够排除小型黑洞(黑色区域)。

形态学梯度(Morphological):是膨胀图与腐蚀图之差,对二值图像可以将团块(blob)的边缘突出来,故用于保留物体的边缘轮廓。

顶帽(Top Hat):原图与开运算图之差,往往用来分离比邻进点亮一些的斑块、在图像具有大幅背景且微小物品比较有规律的情况下,用来提取背景。

黑帽:闭运算图和原图之差,用来分离比邻近点暗一些的斑块。

三、漫水填充

概述:自动选中和种子点相连的区域,接着将该区域替换成指定颜色。

作用:用来标注或者分离图像的一部分进行分析或处理。

四、图像金字塔

①概念:

一幅图像的金字塔是一系列以金字塔形状排列的,分辨率逐步降低且来源于同一张原始图的图像集合。其通过梯次向下采样取得,直到达到某个条件才停止。

金字塔底部是待处理图像的高分辨率表示,而顶部是低分辨率近似。

②类型:

高斯金字塔(Gaussian pyramid)-------用来向下采样

拉普拉斯金字塔(Laplacian pyramid)-------用来从塔低层图像重建上层未采样图像,即预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。

③相关函数

pyrUp(向上采样)--图像在每个维度上扩大为原来的两倍,新增的偶数行和列以0填充。然后给指定滤波器进行卷积去估计“丢失像素”的近似值。表现为放大模糊图片。

pyrDown(对图像向下采样)--------  对图像进行高斯内核卷积,将所有偶数行和列去除  ,得到原图的四分之一。最终表现为模糊缩小图片。

注:上下是针对图像的尺寸而言的(与实际方向相反),也并非是互逆操作。

 

 

图像变换

一、边缘检测--------  滤波-增强-检测

①相关知识

边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此采用滤波器来改善检测器性能。

增强边缘的基础是确定函数各点邻域强度的变化值,将有显著变化的点凸显出来,编程可通过计算梯度幅值来确定。

②相关算子

Canny

Sobel(离散微分算子)------结合了高斯平滑和微分求导,用来计算图像灰度函数的近似梯度,产生对应梯度矢量。

scharr滤波器-----用于配合Sobel算子的运算而存在,仅作用于大小为3的内核。

Laplacian(二阶微分算子&散度)-------让一幅图像减去它的Laplacian算子可以增强对比度。

二、霍夫(Hough)变换-----快速准确的检测出直线或者圆,直接输入只能是边缘二值图像。

①类型

标准霍夫变换(SHT),由HoughLines函数调用

多尺度霍夫变换(MSHT),由HoughLines函数调用

累计概率霍夫变换(PPHT),由HoughLinesP函数调用

霍夫圆变换(),由HoughCircles函数调用,不需要原图为二值图像

三、重映射-----把一幅图像中的某位置像素放置到另一个图片指定位置的过程,使用remap函数调用。

 

 

图像轮廓与图像分割修复

一、查找并绘制轮廓

寻找轮廓:findContours()函数

绘制轮廓:drawContours()函数

二、寻找物体的凸包

寻找凸包:convexHull()函数

三、使用多边形将轮廓包围

返回外部矩形边界:boundingRect()函数

寻找最小包围矩形:minAreaRect()函数

寻找最小包围圆形:minEnclosingCircle()函数

用椭圆拟合二维点:fitEllipse()函数

逼近多边形曲线:approxPolyDP函数

四、图像的矩

①概念:

矩函数在模式识别、目标识别、目标定位及分类等图线分析领域有着广泛应用。从一幅数字图像中计算出来的矩集,通常描述了该图像形状的全局特征,并提供了大小、位置、方向形状等几何特征信息。

一阶矩与形状有关,二阶矩显示曲线围绕直线平均值的扩展程度,三阶矩则是关于平均值的对称性的测量。另外由二阶矩和三阶矩可以导出一组共7个不变矩。而不变矩是图像的统计特征,满足平移、伸缩、旋转均不变的不变性,在图像识别领域得到了广泛应用。

②实现算法

在OpenCV中,计算一个图像的矩一般由三个函数配合求取:

使用moments计算多边形和光栅形状的所有矩(最高到3阶)

使用contourArea来计算整个或者部分轮廓面积

使用arcLength来计算封闭轮廓的周长或曲线长度

五、分水岭算法(watershed algorithm)

①概念:

其基本思想是把图像看作是测地学的拓扑地貌,每一点的像素值表示海拔高度,每个局部极小值及其影响区域称为集水盆,集水盆的边界则形成分水岭。通俗来讲是将图像中的边缘转化成“山脉”,均匀区域转化为“山谷”,便于分割目标。

②实现算法

watershed()----函数由于该函数实现的算法是基于标记的分割算法的一种,因此在把图像传给函数之前需要大致勾画标记出图像中的期望进行分割的区域。

六、图像修补

①概念:

图像修复技术简单来说是利用那些已经被破坏区域的边缘,即边缘的颜色和结构,繁殖和混合到损坏的图像中,达到修补图像的目的。

②实现算法

inpaint()函数-----用来从扫描的照片中清除灰尘和划痕,或者从静态图像或图像视频中去除不需要的物体。

 

 

直方图与匹配

一、直方图的计算和绘制

calcHist()函数-------计算一个或者多个阵列直方图

minMaxLoc()函数------在数组中找到全局的最大/小值

rectangle()函数------绘制矩形

line()函数------绘制线段

二、直方图对比

compareHist()函数----用于对两幅直方图进行比较

其第三个参数是选择距离标准,可采用4种方法

相关(Correlation)、卡方(Chi-Square)、直方图相交(Intersection)、Bhattacharyya距离

三、反向投影

①概念

简单的讲就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的该特征的方法。

②作用

用于在输入图像(较大)中查找与模板图像(较小或者单像素)最匹配的点或者区域,即定位模板图像在输入图像的位置。

③相关函数

calcBackProject()函数-------用于计算直方图的反向投影

mixChannels()函数-----由输入参数复制某通道到输出参数特定的通道中,可重排图像通道

四、模板匹配

①概念

在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术。

②实现函数

matchTemplate()用于匹配出和模板重叠的图像区域,其第四个参数为指定匹配方法,共以下六种:

平方差匹配、归一化平方差匹配、相关匹配、归一化相关匹配、系数匹配、化相关系数匹配

注:方法从简单到复杂,匹配的准确度也越来越高,相对应的计算量也越来越大,最好根据项目需求实验得出两者兼顾的最佳方案。

 

 

角点检测(Corner Detection)

一、Harris角点检测

①相关概念

图像特征类型可以被分为如下三种:

边缘

角点-----点在任意方向的微小变动都会引起灰度很大的变化

斑点

 

当下角点检测算法又可归纳为以下三类:

基于灰度图像的角点检测---又可分为基于梯度、模板、模板梯度组合三类方法

基于二值图像的角点检测

基于轮廓曲线的角点检测

②相关函数

cornerHarris()函数

二、Shi-Tomasi角点检测

goodFeaturesToTrack()函数

注:可用来初始化一个基于点的对象跟踪操作

三、亚像素级角点检测

当我们图像处理的目的不是提取用于识别的特征点而是进行几何测量,那么通常需要更高的精度。

cornerSubPix()函数------用于寻找亚像素角点位置

 

 

特征检测与匹配

一、SURF(SpeedUp Robust Features)特征点检测

①相关概念
②相关函数

drawKeypoints()函数------用于绘制关键点

KeyPoint类-------为特征点检测而生的数据结构,用于表示特征点

二、SURF特征提取

drawMatches()函数----------用于绘制出相匹配的两个图像的关键点

三、使用FLANN(Fast Library for Approximate Nearest Neighbors 快速最邻近逼近搜索函数库)进行特征点匹配

DescriptorMatcher::match()函数----从每个描述符查询集中找到最佳匹配

四、寻找已知物体

在FLANN特征匹配基础上,还可以进一步利用Homography映射找出已知物体。可分为一下两大步:

1.使用函数findHomography寻找匹配上的关键点的变换---------找到并返回源图像和目标图像之间的透视变换H

2.使用perspectiveTransform来映射点群-----------进行向量透视矩阵变换

五、ORB(ORiented Brief)特征提取

①相关概念

Brief(Binary Robust Independent Elementary)描述子----在特征点附近随机选取若干点对,将点对灰度值大小组合成一个二进制串,把该串作为该特征点的特征描述子。

优点就是速度快,缺点:不具备尺度/旋转不变性、对噪声敏感

你可能感兴趣的:(OpenCV)