OpenCV是一个开源的计算机视觉库,由C和C++语言编写,涵盖计算机视觉各个领域内的500多个函数,可以在多种操作系统上运行。旨在提供一个简洁而又高效的接口,从而帮助开发人员快速构建视觉应用。
在图像处理过程中,可能会对图像的某一个特定区域感兴趣,该区域被称为感兴趣区域(Region of Interest,ROI),在设定ROI后,就可以对该区域进行整体操作。
1.使用加法运算符“+”对图像a和图像b进行求和运算时,遵循以下规则。
2.函数cv2.add()可以用来计算图像像素值相加的和,其语法格式为:
计算结果=cv2.add(像素值a,像素值b)
在对8位灰度图的像素值求和时,遵循以下规则:
在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为:
dst=saturate(src1 * alpha + src2 * beta + gamma)
OpenCV中提供了函数cv2.addWeighted(),用来实现图像的加权和,该函数的语法格式为:
dst=cv2.addWeighted(src1,alpha,src2,beta,gamma)
1.按位与预算:参与运算的两个逻辑值都为真时,结果才为真。cv2.bitwise_add();
2.按位或运算:但=当参与或运算的两个逻辑值中有一个为真时,结果为真。cv2.bitwise_or();
3.按位非运算:运算数为真时,结果为假;运算数为假时,结果为真。cv2.bitwise_not();
4.按位异或运算:cv2.bitwise_xor();
当使用掩模参数(mask[])时,操作只会在掩模值为非空的像素点上执行,并将其他像素点的值置为0 。
通过对原始图像与密钥图像进行按位异或,可以实现加密;
将加密后的图像与密钥图像再次进行按位异或,可以实现解密。
最低有效位隐藏是指,将一个需要隐藏的二值图像信息嵌入载体图像的最低有效位(二进制数中的第0位),即将载体图像的最低有效位层替换为当前需要隐藏的二值图像,从而实现将二值图像隐藏的目的。由于二值图像处于载体图像的最低有效位上,所以对于载体图像的影响非常不明显,具有较高的隐蔽性。
1.GRAY色彩空间:8位灰度图,具有256个灰度级,像素值的范围是[0,255] 。
由RGB色彩空间转换为GRAY色彩空间时,处理方式为:
Gray=0.299·R+0.587·G+0.114·B
2.XYZ色彩空间:由CIE定义的,更便于计算的色彩空间,可以与RGB色彩空间相互转换。
将RGB色彩空间转换为XYZ色彩空间,转换形式为:
将XYZ色彩空间转换为RGB色彩空间,转换形式为:
3.YCrCb色彩空间:在该色彩空间中,Y代表光源的亮度,色度信息保存在Cr(红色信息分量)和Cb(蓝色信息分量)中。亮度给出了颜色亮或暗的程度信息,该信息可以通过照明中强度成分的加权和来计算。
4.HSV色彩空间:该色彩空间是一种面向视觉感知的颜色模型,从心理学和视觉的角度出发,指出人眼的色彩知觉主要包含三要素:色调(Hue)、饱和度(Saturation)、亮度(Value),色调指光的颜色,与混合光谱中主要光波长相关;饱和度指色彩的深浅程度,或一种颜色混合白光的数量且成反比;亮度指人眼感受到的光的明暗程度掺入白色越多,亮度越高。
5.HLS色彩空间:包含的三要素时色调H(Hue)、光亮度/明度L(Lightness)、饱和度(Saturation),L用来控制色彩的明暗变化,衡量有多少光线从物体表面反射出来。
6.CIELab*色彩空间:是均匀色彩空间模型,是面向视觉感知的色彩模型,从视觉感知均匀的角度来讲,人所感知到的两种颜色的区别程度,与这两种颜色在色彩空间中的距离成正比。
7.CIELuv*色彩空间:与设备无关,适用于显示器显示和根据加色原理进行组合的场合,该模型中比较强调对红色的表示,即对红色比较敏感,但对蓝色的变化不太敏感。
8.Bayer色彩空间:被广泛应用在CCD和CMOS相机中,能够从单平面R、G、B交错表内获取彩色图像。输出的RGB图像的像素点,是根据当前点的1个、2个或4个领域像素点的相同颜色的像素值获得的。
在RGB色彩空间的三个通道得基础上,还可以加上一个A通道,也叫alpha通道,表示透明度。alpha通道的赋值范围是[0,1],或者[0,255],表示从透明到不透明。
几何变换是指将一幅图像映射到另外一幅图像内的操作。
cv2.resize()
cv2.flip()
能够实现图像在水平方向翻转、垂直方向翻转、两个方向同时翻转。
cv2.warpAffine()
图像可以通过一系列的几何变换来实现平移、旋转等多种操作,该变换能够保持图像的平直性(图像经过仿射变换后,直线仍然是直线)和平行性(图像完成仿射变换后,平行线仍然是平行线)。
cv2.warpPerspective()
将矩形映射为任意平行四边形
cv2.remap()
把一幅图像内的像素点放置到另外一幅图像内的指定位置。
阈值处理是指剔除图像内像素值高于一定值或者低于一定值的像素点,从而实现前景与背景的分离。
1.二值化阈值处理:将原始图像处理为仅有两个值的二值图像,灰度值大于阈值thresh的像素点,将其灰度值设定为最大值;对于灰度值小于或等于阈值thresh的像素点,将其灰度设定为0 。
2.反二值化阈值处理:针对像素点的处理方式为:对于灰度值大于阈值的像素点,将其值设定为0;对于灰度值小于或等于阈值的像素点,将其值设定为255 。
3.截断阈值化处理:将图像中大于阈值的像素点的值设定为阈值,小于或等于该阈值的像素点的值保持不变。
4.超阈值零处理:将图像中大于阈值的像素点的值处理为0,小于或等于该阈值的像素点的值保持不变。
5.低阈值零处理:将图像中小于或等于阈值的像素点的值处理为0,大于阈值的像素点的值保持不变。
通过计算每个像素点周围临近区域的加权平均值或得阈值,并使用该阈值对当前像素点进行处理,能够更好处理明暗差异较大的图像。
能够根据当前图像给出最佳的类间分割阈值,即遍历所有可能的阈值,从而找到最佳阈值。
在尽量保留原有信息的情况下,过滤掉图像内部的噪声,这一过程称为对图像的平滑处理,所得的图像称为平滑图像。图像平滑处理会对图像中与周围像素点的像素值差异较大的像素值进行处理,将其调整为周围像素点像素值的近似值。
用当前像素点周围N·N个像素值的均值来代替当前像素值使用该方法遍历处理图像内的每一个像素点,即可完成整幅图像的均值滤波。
在均值滤波中,滤波结果的像素值是任意一点的领域平均值,而在方框滤波中,可以自由选择是否对均值滤波的结果进行归一化,即可自由选择滤波结果是领域像素值之和的平均值,还是领域像素值之和。
在进行前两种滤波时,其领域内的每个像素的权重是相等的,在高斯滤波中,会将中心点的权重值加大,远离中心点的权重值减小,在此基础上计算领域内各个像素值不同权重的和。
中值滤波用邻域内所有像素值的中间值替代当前像素点的像素值。
双边滤波是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效保护图像内的边缘信息,当处在边缘时,与当前色彩相近的像素点(颜色距离很近)会被给予较大的权重值;而与当前色彩差别较大的像素点(颜色距离很远)会被给予较小的权重值(极端情况下权重可能为0,直接忽略该点),这样就保护了边缘信息。
允许用户自定义卷积核实现卷积操作。
形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义,通常是图像理解时所使用的最本质的形状特征。
腐蚀能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除。用来收缩或者细化二值图像中的前景,借此实现去除噪声、元素分割等功能。
膨胀操作能对图像的边界进行扩张,将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。
开运算的操作是先将图像腐蚀,再对腐蚀结果进行膨胀。开运算可以用于去噪、计数等。
先膨胀后腐蚀的运算,有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。
用原始图像减去其开运算图像的操作。礼帽运算能够获取图像的噪声信息,或者得倒比原始图像的边缘更亮的边缘信息。
用闭运算图像减去原始图像的操作,能够获取图像内部的小孔,或前景色中的小黑点,或者得到比原始图像的边缘更暗的边缘部分。
图像梯度计算的是图像变化的速度。对于图像的边缘部分,其灰度变化较大,梯度值也较大;相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小。图像梯度计算的是图像的边缘信息。
Sobel算子是一种离散的微分算子,该算子结合了高斯平滑和微分求导运算,利用局部差分寻找边缘,计算所得的是一个梯度的近似值。
Scharr算子具有和Sobel算子同样的速度,且精度更高。
Laplacian(拉普拉斯)算子是一种二阶导数算子,具有旋转不变性,可以满足不同方向的图像边缘的锐化(边缘检测)的要求。
Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法。
1.**应用高斯滤波去除图像噪声:**图像边缘非常容易收到噪声的干扰,滤波可以平滑一些纹理较弱的非边缘区域,避免检测到错误的边缘信息以便得到更准确的边缘。
2.非极大值抑制逐一遍历像素点,判断当前像素点是否为周围像素点中具有相同梯度方向的最大值,并根据判断结果决定是否抑制该点。如果该点是正/负梯度方向上的局部最大值,则保留该点;如果不是,则抑制该点。
3.应用双阈值确定边缘通过判断虚边缘与强边缘是否连接,来确定虚边缘到底是真实图像还是噪声。与强边缘连接,则将该边缘处理为边缘;与强边缘无连接,则该边缘为弱边缘,将其抑制。
图像金字塔是由一幅图像的多个不同分辨率的子图所构成的图像集合。该组图像是由单个图像通过不断地降采样所产生的,最小的图像可能仅仅有一个像素点。图像金字塔是一系列以金字塔形状排列的、自底向上分辨率逐渐降低的图像集合。
通常情况下,图像金字塔的底部是待处理的高分辨率图像(原始图像),而顶部则为其低分辨率的近似图像。向金字塔的顶部移动时,图像的尺寸和分辨率都不断地降低。通常情况下,每向上移动一级,图像的宽和高都降低为原来的二分之一。
图像金字塔是同一图像不同分辨率的子图集合,是通过对原图像不断地向下采样而产生的,即由高分辨率的图像(大尺寸)产生低分辨率的近似图像(小尺寸)。
最简单的图像金字塔可以通过不断地删除图像的偶数行和偶数列得到。例如,有一幅图像,其大小是NN,删除其偶数行和偶数列后得到一幅(N/2)(N/2)大小的图像。经过上述处理后,图像大小变为原来的四分之一,不断地重复该过程,就可以得到该图像的图像金字塔。
一幅图像在经过向下采样后,再对其进行向上采样,是无法恢复为原始状态的。对此,我们也用程序进行了验证。向上采样并不是向下采样的逆运算。这是很明显的,因为向下采样时在使用高斯滤波器处理后还要抛弃偶数行和偶数列,不可避免地要丢失一些信息。
为了在向上采样时能够恢复具有较高分辨率的原始图像,就要获取在采样过程中所丢失的信息,这些丢失的信息就构成了拉普拉斯金字塔。
拉普拉斯金字塔的作用在于,能够恢复高分辨率的图像。
边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。图像轮廓是指将边缘连接起来形成的一个整体。
比较两个轮廓最简单的方法是比较是比较两者的轮廓矩。轮廓矩代表了一个轮廓、一幅图像、一组点集的全局特征。矩信息包含了对应对象不同类型的几何特征,例如大小、位置、角度、形状等。矩特征被广泛应用在模式识别、图像识别等方面。
OpenCV提供了函数cv2.moments()来获取图像的moments特征。
Hu矩阵是归一化中心矩的线性组合。Hu矩在图像旋转、缩放、平移的等操作后,仍能保持矩的不变性,所以经常使用Hu矩来识别图像的特征。
在OpenCV中,使用函数cv2.HuMoments()可以得到Hu距。
在计算轮廓时,可能并不需要实际的轮廓,而仅需要一个接近于轮廓的近似多边形
函数cv2.boundingRect()能够绘制轮廓的矩形边界。
函数cv2.minAreaRect()能够绘制轮廓的最小包围矩形框
函数cv2.minEnclosingCircle()通过迭代算法构造一个对象的面积最小包围圆形。
函数cv2.fitEllipse()可以用来构造最优拟合椭圆。
函数cv2.fitLine()用来构造最优拟合直线
函数cv2.minEnclosingTriangle()用来构造最小外包三角形。
函数cv2.approxPolyDP()用来构造指定精度的逼近多边形曲线。
逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一个多边形的凸包来简化它。凸包跟逼近多边形很像,只不过它是物体最外层的“凸”多边形。凸包指的是完全包含原有轮廓,并且仅由轮廓上的点所构成的多边形。
OpenCV提供函数cv2.convexHull()用于获取轮廓的凸包。
凸包与轮廓之间的部分,称为凸缺陷。在OpenCV中使用函数cv2.convexityDefects()获取凸缺陷。
直方图是图像内灰度值的统计特性与图像灰度值之间的函数,直方图统计图像内各个灰度级出现的次数。从直方图的图形上观察,横坐标是图像中各像素点的灰度级,纵坐标是具有该灰度级(像素值)的像素个数。
如果一幅图像拥有全部可能的灰度级,并且像素值的灰度均匀分布,那么这幅图像就具有高对比度和多变的灰度色调,灰度级丰富且覆盖范围较大。在外观上,这样的图像具有更丰富的色彩,不会过暗或过亮。
原始图像的直方图,灰度级集中在中间,图像中没有较暗和较亮的像素点;对原图均衡化后的直方图,像素分布更均衡。直方图均衡化的主要目的是将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均匀的图像。这种均衡化,既实现了灰度值统计上的概率均衡,也实现了人类视觉系统(Human Visual System, HVS)上的视觉均衡。
图像处理一般分为空间域处理和频率域处理。
空间域处理是直接对图像内的像素进行处理。空间域处理主要划分为灰度变换和空间滤波两种形式。灰度变换是对图像内的单个像素进行处理,比如调节对比度和处理阈值等。空间滤波涉及图像质量的改变,例如图像平滑处理。空间域处理的计算简单方便,运算速度更快。
频率域处理是先将图像变换到频率域,然后在频率域对图像进行处理,最后再通过反变换将图像从频率域变换到空间域。傅里叶变换是应用最广泛的一种频域变换,它能够将图像从空间域变换到频率域,而逆傅里叶变换能够将频率域信息变换到空间域内。傅里叶变换在图像处理领域内有着非常重要的作用。
傅里叶变换的目的,就是为了将图像从空域转换到频域,并在频域内实现对图像内特定对象的处理,然后再对经过处理的频域图像进行逆傅里叶变换得到空域图像。傅里叶变换在图像处理领域发挥着非常关键的作用,可以实现图像增强、图像去噪、边缘检测、特征提取、图像压缩和加密等。
模板匹配是指在当前图像A内寻找与图像B最相似的部分,一般将图像A称为输入图像,将图像B称为模板图像。模板匹配的操作方法是将模板图像B在图像A上滑动,遍历所有像素以完成匹配。
霍夫变换是一种在图像中寻找直线、圆形以及其他简单形状的方法。霍夫变换采用类似于投票的方式来获取当前图像内的形状集合,该变换由Paul Hough(霍夫)于1962年首次提出。最初的霍夫变换只能用于检测直线,经过发展后,霍夫变换不仅能够识别直线,还能识别其他简单的图形结构,常见的有圆、椭圆等。
任何一幅灰度图像,都可以被看作是地理学上的地形表面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷。如果我们向每一个山谷中“灌注”不同颜色的水,那么,随着水位不断地升高,不同山谷的水就会汇集到一起。在这个过程中,为了防止不同山谷的水交汇,我们需要在水流可能汇合的地方构建堤坝。该过程将图像分成两个不同的集合:集水盆地和分水岭线。我们构建的堤坝就是分水岭线,也即对原始图像的分割。这就是分水岭算法。
由于噪声等因素的影响,采用上述基础分水岭算法经常会得到过度分割的结果。过度分割会将图像划分为一个个稠密的独立小块,让分割失去了意义。为了改善图像分割效果,人们提出了基于掩模的改进的分水岭算法。改进的分水岭算法允许用户将他认为是同一个分割区域的部分标注出来(被标注的部分就称为掩模)。这样,分水岭算法在处理时,就会将标注的部分处理为同一个分割区域。
经典的前景提取技术主要使用纹理(颜色)信息,或根据边缘(对比度)信息完成。在开始提取前景时,先用一个矩形框指定前景区域所在的大致位置范围,然后不断迭代地分割,直到达到最好的效果。经过上述处理后,提取前景的效果可能并不理想,存在前景没有提取出来,或者将背景提取为前景的情况,此时需要用户干预提取过程。用户在原始图像的副本中(也可以是与原始图像大小相等的任意一幅图像),用白色标注要提取为前景的区域,用黑色标注要作为背景的区域。然后,将标注后的图像作为掩模,让算法继续迭代提取前景从而得到最终结果。
K近邻算法的本质是将指定对象根据已知特征值分类。
支持向量机(Support Vector Machine, SVM)是一种二分类模型,目标是寻找一个标准(称为超平面)对样本数据进行分割,分割的原则是确保分类最优化(类别之间的间隔最大)。当数据集较小时,使用支持向量机进行分类非常有效。支持向量机是最好的现成分类器之一,这里所谓的“现成”是指分类器不加修改即可直接使用。
在对原始数据分类的过程中,可能无法使用线性方法实现分割。支持向量机在分类时,把无法线性分割的数据映射到高维空间,然后在高维空间找到分类最优的线性分类器。
K均值聚类是一种将输入数据划分为k个簇的简单的聚类算法,该算法不断提取当前分类的中心点(也称为质心或重心),并最终在分类稳定时完成聚类。从本质上说,K均值聚类是一种迭代算法。
K均值聚类算法的基本步骤如下:
1.随机选取k个点作为分类的中心点。
2.将每个数据点放到距离它最近的中心点所在的类中。
3.重新计算各个分类的数据点的平均值,将该平均值作为新的分类中心点。
4.重复步骤2和步骤3,直到分类稳定。
在第1步中,可以是随机选取k个点作为分类的中心点,也可以是随机生成k个并不存在于原始数据中的数据点作为分类中心点。
在第3步中,提到的“距离最近”,说明要进行某种形式的距离计算。在具体实现时,可以根据需要采用不同形式的距离度量方法。当然,不同的计算方法会对算法的性能产生影响。