您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 机器视觉&图像处理学习笔记(基于OpenCV)
OpenCV学习笔记收集者:M.E.Email:zhong1980me@163.comOpenCV核心功能一览:图像数据的操作(分配、释放、复制、设置和转换)。图像是视频的输入输出I/O(文件与摄像头的输入、图像和视频文件输出)。矩阵和向量的操作以及线性代数的算法程序(矩阵积、解方程、特征值以及奇异值等)。各种动态数据结构(列表、队列、集合、树、图等)。基本的数字图像处理(滤波、边缘检测、角点检测、采样与差值、色彩转换、形态操作、直方图、图像金字塔等)。结构分析(连接部件、轮廓处理、距离变换、各自距计算、模板匹配、Hough变换、多边形逼近、直线拟合、椭圆拟合、Delaunay三角划分等)。摄像头定标(发现与跟踪定标模式、定标、基本矩阵估计、齐次矩阵估计、立体对应)。.运动分析(光流、运动分割、跟踪)。目标识别(特征法、隐马尔可夫模型:HMM)。基本的GUI(图像与视频显示、键盘和鼠标事件处理、滚动条)。图像标注(线、二次曲线、多边形、画文字)一、基本知识灰度。可简单理解为亮度。灰度为0时表示没有亮度,显示为黑色。灰度为255时表示最大亮度,显示为白色。色彩。常见为RGB(red,green,blue)色彩体系,这是一种设备友好的色彩坐标体系。RGB三元色中,可根据不同颜色分量合成其它颜色,但这也是其图像处理时容易出现多种计算可能的地方,所以个人认为应用RGB色彩体系处理图像是不利的。因此实际处理彩色图像时,一般将其转化为HSV(hue,saturation,vale:色度,饱和度,亮度)色彩体系。HSV图像中,可通过通道分解获得H通道数据,这是颜色信息所在的通道,一般不具有其他多种颜色混合的可能。H分量是HSV模型中唯一跟颜色本质相关的分量。只要固定了H的值,并且保持S和V分量不太小,那么表现的颜色就会基本固定。H分量是代表颜色特性的分量,用角度度量,取值范围为0~360,从红色开始按逆时针方向计算,红色为0,绿色为120,蓝色为240。S分量代表颜色的饱和信息,取值范围为0.0~1.0,值越大,颜色越饱和。V分量代表明暗信息,取值范围为0.0~1.0,值越大,色彩越明亮。但是要注意:颜色判断时光判断H分量的值是否就足够了?事实上是不足的。固定了H的值以后,如果移动V和S会带来颜色的饱和度和亮度的变化。当V和S都达到最高值,也就是1时,颜色是最纯正的。降低S,颜色越发趋向于变白。降低V,颜色趋向于变黑,当V为0时,颜色变为黑色。因此,S和V的值也会影响最终颜色的效果。可以设置一个阈值,假设S和V都大于阈值时(矩形框),颜色才属于H所表达的颜色,例如下图所示蓝色区域的选择。其余色彩体系如YCrCb(亮度,红色比例,蓝色比例)等比较少用了。如果无需色彩体系,可直接转化为灰度图,可大幅降低数据处理量。二、图像几何变换平移、缩放、扭曲、旋转是图像的几何变换,把一幅图像中一个位置的像素重映射到另一个位置,又分为仿射变换(基于2×3矩阵进行的变换)和透视变换(基于3×3矩阵进行的变换,又叫做单应性映射)。仿射变换可以将矩形转换成平行四边形,它可以将矩形的边压扁但必须保持边是平行的,也可以将矩形旋转或者按比例变化。透视变换提供了更大的灵活性,一个透视变换可以将矩阵转变成梯形。当然,平行四边形也是梯形,所以仿射变换是透视变换的子集。仿射变换利用cvWarpAffine/cvGetAffineTransform解决密集映射,用cvTransform解决稀疏映射(例如对一系列独立点的映射)。透视变换利用cvWarpPerspective/cvGetPerspectiveTransform解决密集映射,利用cvPerspectiveTransform/cvGetPerspectiveTransform/findHomography解决稀疏映射。三、阈值化处理即最简单的图像分割,基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割。注意阈值的选取依赖于具体的问题,即物体在不同的图像中可能会有不同的灰度值。常见的方法包括:OTSU阈值化(大津阈值法),固定阈值化/threshold,自适应阈值化/adaptiveThreshold(可直接获得轮廓线)等。注意阈值化时各函数参数的设置可能有意想不到的效果,可查阅相关手册。四、图像直方图/histogram根据图像颜色,可分为灰度直方图、BGR直方图、H-S直方图等。直方图获得:calcHist(),注意参数中可指定横坐标范围、统计区间等。直方图进行均衡操作/equalizeHist可用于平衡图像中的局部过亮或过暗区域。直方图匹配又叫直方图规定化(HistogramNormalization/Matching)是指对一副图像进行变换,使其直方图与另一幅图像的直方图或特定函数形式的直方图进行匹配,例如:应用场景如不同光照条件下的两幅图像,我们可以在比较两幅图像前先进行匹配变化。直方图对比/compareHist。五、距离变换/distanceTransform用于计算图像中每一个非零点距离离自己最近的零点的距离,结果图像上越亮的点代表了离零点的距离越远。可用于用于细化字符的轮廓和查找物体质心(中心)。对字母进行细化:对数字进行细化:标记质心(绿色点,计算结果矩阵中的最亮点即最大值点):六、Gamma校正对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系。为什么进行Gamma校正?一方面,人眼对外界光源的感光值与输入光强不是呈线性关系的,而是呈指数型关系的。在低照度下,人眼更容易分辨出亮度的变化,随着照度的增加,人眼不易分辨出亮度的变化。而摄像机感光与输入光强呈线性关系。另一方面,为能更有效的保存图像亮度信息。未经gamma校正的情况下,低灰度时,有较大范围的灰度值被保存成同一个值,造成信息丢失;同时高灰度值时,很多比较接近的灰度值却被保存成不同的值,造成空间浪费。需自己编写校正代码。注意区别矩阵线性叠加函数addWeighted(InputArraysrc1,doublealpha,InputArraysrc2,doublebeta,doublegamma,OutputArraydst,intdtype=-1)中的gamma平移值:M=alpha*M1+beta*M2+gamma。七、批量更改像素值LUT(LookUpTable)查表替换法,表里面存储了像素值的映射值,预先计算好存储备用,相当于离线预置。这是最被推荐的用于实现批量图像像素值查找和更改操作的方法,有利于提高实时性。在图像处理中,对于一个给定的值,将其替换成其他的值是一个很常见的操作,OpenCV提供里一个函数LUT()直接实现该查表替换操作,并不需要自己扫描图像。八、图像采样/插值用于减小或增大图像分辨率(像素数,宽度*高度),包括最近邻插值、线性插值/resize()、图像金字塔(pyrUp,pyrDown)等。插值时,像素取整时用三类浮点转整操作:cvRound\cvFloor\cvCeil,分别用于获得四舍五入整数、小于参数的最大整数、大于参数的最小整数。九、傅里叶变化/DFT图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率值较高。(可以这么理解,图像中的低频部分指低梯度的点,高频部分则相反)。傅立叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。观察傅立叶变换后的频谱图(也叫功率图),可以看出图像的能量分布,如果频谱图中暗的点数更多,那么实际图像是比较柔和的(因为各点与邻域差异都不大,梯度相对较小),反之,如果频谱图中亮的点数多,那么实际图像一定是尖锐的,边界分明且边界两边像素差异较大的。傅里叶变换之后的图像在原点平移之前四角是低频、最亮,平移之后中间部分是低频、最亮,亮度大说明低频的能量大。频谱移频到原点以后,可以看出图像的频率分布是以原点为圆心,对称分布的。图像的明暗纹理的角度与FFT变化后的亮线角度一致。getOptimalDFTSize用于调整图像尺寸为最合适的DFT变化尺寸。十、图像平滑(模糊)滤波技术/Blur()图像平滑与图像模糊是同一概念,主要用于图像的去噪。平滑要使用滤波器,为不改变图像的相位信息,一般使用线性滤波器。从信号处理的角度来看,实际上是一种“低通滤波器”。常见滤波方法:盒滤波/boxFilter、均值滤波/blur、中值滤波/medianBlur、高斯滤波/GaussianBlur、双边滤波/bilateralFilter。一个比好用的功能是图像污点修复/inpaint,常用于图像中的文本、Logo图标、水印、划痕等。medianBlur在去噪的同时还能让边缘锐化。bilateralFilter可平滑平坦区域同时保持边缘锐化,但效率低。十一、形态学变换/morphologyEx()注意:形态学变化是对图像中的白色部分(高亮部分)而言的,不是黑色部分!(1)膨胀/dilate,求局部最大值的操作。腐蚀/erode,求局部最小值的操作。膨胀就是图像中的高亮部分进行膨胀,“领域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中的高亮部分被腐蚀,“领域被蚕食”,效果图拥有比原图更小的高亮区域。原图膨胀后腐蚀后(2)开/open,先腐蚀后膨胀,用于消除小物体,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积,同时抑制比给定结构元小的亮细节。闭/close,先膨胀后腐蚀,用来填充物体内细小白色空洞、连接邻近的物体、平滑其边界的同时并不明显改变其面积,同时抑制比给定结构元小的暗细节。开运算闭运算原图开运算结果(消除小物体)原图闭运算结果(填充小洞)(3)形态学梯度/gradient,膨胀图和腐蚀图相减,将边缘突出来,可以用来保留物体的边缘轮廓。原图形态学梯度结果原图形态学梯度结果(4)顶帽(白帽变换)/topHat,原图像减去开运算图像,突出原图像中比周围亮的区域,用于校正不均匀关照的影响(均匀光照在从背景中提取目标的处理中扮演核心的角色)。低帽(黑帽变换)/blackHat,闭运算图像减去原图像,用于突出比原图轮廓周围更暗的区域。原图顶帽结果原图低帽结果(5)击中-击不中/Hit-miss,对图像做两次腐蚀然后取交集:首先,建立一个比B大的模板W,使用此模板对图像A进行腐蚀,得到图像假设为Process1;其次,用B减去W,从而得到V模板(W-B);使用V模板对图像A的补集进行腐蚀,得到图像假设为Process2;然后,Process1与Process2取交集;得到的结果就是B的位置(可能不是B的中心位置,要视W-B时对齐的位置而异)。案例:给定一把钥匙,如何从一串钥匙中匹配该钥匙?每把钥匙尾部都不同,但钥匙图像尺寸都相同。(6)细化/Thinning(或:骨架/Skeletonization),经过一层层的剥离,从原来的图中去掉一些点,但仍要保持原来的形状,直到得到图像的骨架。OpenCV中未提供相应算法,建议参考Zhang细化算法或Hilditch细化算法。原图细化结果十二、边缘检测/Edge灰度或结构等信息的突变位置便是图像的边缘,图像的边缘有幅度和方向属性,沿边缘方向像素变化缓慢,垂直边缘方向像素变化剧烈。因此,边缘上的变化能通过梯度计算出来。常用的检测方法:Sobel、Laplacian、Roberts、Canny、Prewitt、Marr-Hildreth等。Soble使用了单一阈值,不能兼顾到低阈值的丰富边缘和高阈值时的边缘缺失这两个问题。而Canny算子使用了双阈值,可以很好的兼顾这两方面,所以相比较而言,Canny边缘检测要更优一点。Canny边缘检测用在非常细致的边缘,但也因此很容易受随机噪声的影响,所以一般都需要在边缘检测前进行滤波去噪。Sobel可以指定检测垂直或水平边缘。Laplacian边缘检测的结果最接
本文标题:机器视觉&图像处理学习笔记(基于OpenCV)
链接地址:https://www.777doc.com/doc-6369850 .html