- 读取图像
retval = cv2.imread(filename[,flags])
retval 读到图像,未读到返回None
filename 文件名,支持格式.bmp,dib,jpeg,jpg,jpe,jp2,png,webp,pbm,pgm,ppm,pxm,pnm,sr,ras,tiff,tif,exr,hdr,pic,raster,Vector
flags 读取标记
cv2.IMREAD_UNCHANGED 1 保留原格式
cv2.IMREAD_GRAYSCALE 0 灰度图像
cv2.IMREAD_COLOR 1 BGR图像(默认)
cv2.IMREAD_ANYDEPTH 2 当载入的图像深度为16或者32位时,就返回其对应深度的图像,否则就转为8位图像
cv2.IMREAD_ANYCOLOR 4 以任何可能的颜色格式读取图像
cv2.IMREAD_ LOAD_GDAL 8 使用GDAL驱动程序加载图像
cv2.IMREAD_REDUCED_GRAYSCALE_2 将图像转为单通道灰度图,并将尺寸减小1/2
cv2.IMREAD_REDUCED_GRAYSCALE_4 将图像转为单通道灰度图,并将尺寸减小1/4
cv2.IMREAD_REDUCED_GRAYSCALE_8 将图像转为单通道灰度图,并将尺寸减小1/8
cv2.IMREAD_REDUCED_COLOR_2 较图像转为3通道BGR彩色图,并将尺寸减小1/2
cv2.IMREAD_REDUCED_COLOR_4 较图像转为3通道BGR彩色图,并将尺寸减小1/4
cv2.IMREAD_REDUCED_COLOR_8 较图像转为3通道BGR彩色图,并将尺寸减小1/8
-
显示图像
None = cv2.namedWindow(winname) 创建指定名的窗口
None = cv2.imshow(winname,img)
-
等待按键
retval = cv2.waitKey([delay])
retval 按键返回值按键的ASCII码,没有按键-1
delay 等待键盘触发时间ms,0或负数,一直等待,默认0
-
获取字符的ASCII码值
ord(“A”)
-
销毁指定的窗口
None = cv2.destroyWindow(winname)
-
销毁所有的窗口
None = cv2.destroyAllWindow()
-
保存图像
retval = cv2.imwrite(filename,img[,params])
retval 保存结果True False成功或失败
filename 要保存的完整文件名
img 被保存的图像
params 保存的类型参数
像素处理
最小数据类型无符号的8位数
二值图像转为特殊的灰度图0黑色255白色
opencv 通道顺序 BGR 与RGB相反,img[:,:,0] B通道 img[:,:,1] G通道 img[:,:,2] R通道
- 常用数据生成
img = np.zero((2,4,3),dtype=np.uint8) 0
img = np.ones((2,4,3),dtype=np.uint8) 1
img = np.random.randint(0,256,size=[5,5,3],dtype=np.uitn8)
-
numpy.array更快的访问像素
item(行,列)
itemset(索引值,新值) 索引值=(行,列)
-
感兴趣区域ROI
img[200:400,200:400]
-
通道拆分
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
b,g,r = cv2.split(img)
b = cv2.split(img)[0]
g = cv2.split(img)[1]
r = cv2.split(img)[2]
- 通道合并
bgr = cv2.merge([b,g,r])
-
获取图像的属性
img.shape 返回行数,列数,通道数,如是二值图或灰度图,只有行列数
img.size 返回像素数目,行数列数通道数,如是二值图或灰度图,通道数为1
img.dtype 返回图像的数据类型
-
图像的加法
a+b的和除以256
cv2.add(a,b[,mask]) 和大于255,取值255
-
图像加权和
dst = cv2.addWeighted(src1,alpha,src2,beta,gamma)
dst=src1alpha+src2beta+gamma
-
按位与
dst = cv2.bitwise_and(src1,src2[,mask])
mask 8位单通道array值,常用于保留掩模内的图像
-
按位或
dst = cv2.bitwise_or(src1,src2[,mask])
-
按位异或
dst = cv2.bitwise_xor(src1,src2[,mask])
-
按位取反 非
dst = cv2.bitwise_not(src1,src2[,mask])
-
位平面分解
阀值处理
mask = img[:,:,i]>0 将图像中大于0的值处理为True <=0的处理为 False
img[mask] = 255 将True替换为255,False替换为0
opencv提像了专门的阀值处理函数cv2.threshold()
-
图像加解密,水印
加密: 明文A与密钥B异或,得到密文C
解密:密文C与密钥B异或,得到明文A
水印在最低有效位LSB隐藏信息,对整体图像影响不明显
色彩空间类型转换
类型转换
dst = cv2.cvtColor(src, code[,dstCn])
dst 转换后的图像,与原图具有同样的数据类型各深度
src 要转换的原图
code 色彩空间转换码
dstCn 目标通道数,默认0,自动通过原始输入图和code得到

更多类型查看官网
- 锁定特征值,可提取特定颜色
dst = cv2.inRange(src, lowerb,upperb)
dst 输出结果,大小和src一致,如果值在区间内,dst对应位置为255,否则为0,可以作为一个掩码数组
src 要检查的图像或数组
lowerb 范围下界
upperb 范围上界
-
alpha通道
RGBA色彩空间4通道,alpha通道值[0,1]或[0,255]表示从透明到不透明
几何变换
-
缩放
dst = cv2.resize(src,dSize[,fx[,fy[,interpolation]]])
dst 输出的图像,类型与src相同,大小为dSize(非0时)或通过计算得到
src 要缩放的图像
dSize 输出图像大小,为None时能过缩放比计算
fx 水平方向的缩放比
fy 垂直方向的缩放比
interpolation 插值方式 在缩小图像时,使用区域插值方式能有好的效果cv2.INTER_AREA,放大图像时,使用三次样条INTER_CUBIC(慢)和双线性INTER_LINEAR插值效果不错(快)
-
翻转
dst = cv2.flip(src, flipCode)
flipCode 旋转类型0绕着X轴翻转,正数绕着y轴,负数绕着x,y轴同时翻转
-
仿射
dst(x,y) = src(M11x+M12y+M13,M21x+M22y+M23)
dst = cv2.warpAffine(src,M,dSize[,flags[,borderMode[,borderValue]]])
M 2X3的变换矩阵,使用不同的矩阵,实现不同的仿射变换
dSize 输出图像的大小
flags 插值方式,默认INTER_LINEAR,为WARP_INVERSE_MAP时,M是逆变换类型
borderMode 代表边类型,默认BORDER_CONSTANT,目标图像内值不做改变,对应原始图像内的异常值
borderValue 边界值,默认为0
平移M
dst(x,y) = src(x+100,y+200)
M = np.float32([1,0,100],[0,1,200])
旋转M
M = cv2.getRotationMatrix2D(center,angle,scale)
center 旋转的中心点
angle 旋转的角度,正表示逆时针,负表示正时针旋转
scale 放大缩小变换尺度
复杂变换M
M = cv2.getAffineTransform(src,dst)
src 输入图像的三个顶点坐标
dst 输出图像的三个顶点坐标
-
透视变换,可以将矩形应射为任意四边形
dst = cv2.warpPerspective(src,M,dSuze[,flags[,borderMode[,borderValue]]])
M 3X3的变换矩阵,使用不同的矩阵,实现不同的仿射变换
dSize 输出图像的大小
flags 插值方式,默认INTER_LINEAR,为WARP_INVERSE_MAP时,M是逆变换类型
borderMode 代表边类型,默认BORDER_CONSTANT,目标图像内值不做改变,对应原始图像内的异常值
borderValue 边界值,默认为0
构造M函数
M = cv2.getPerspectiveTransform(src,dst)
src 输入图像的四个顶点坐标
dst 输出图像的四个顶点坐标
-
重映射
dst = cv2.remap(src,mapX,mapY,interpolation[,borderMode[,borderValue]])
mapX 参数有两种可能表示(x,y)点的一个映射 表示CV_16SC2,CV_32FC1,CV_32FC2类型(x,y)点的x值
mapY 当map1表示(x,y)时,值为空,(是x,y)点的x值时,是CV_16UC1,CV_32FCL1类型(x,y)点的y值
interpolation 插值方式,不支持INTER_LINEAR方法
borderMode 边界模式
borderValue 边界值,默认0
可以实现复制,翻转,缩放等操作
阀值处理
-
retval, dst = cv2.threshold(src,thresh,maxval,type)
retval 返回的阀值
dst 阀值分割结果图像
thresh 设定的阀值
maxval 当type设定为THRESH_BINARY,THRESH_BINARY_INV时,需要设定最大值
type cv2.THRESH_BINARY 二值化阀值处理 THRESH_BINARY_INV反二值化阀值处理 THRESH_TRUNC截断阈值化处理 THRESH_TOZERO_INV超阈值零处理 THRESH_TOZERO 低阈值零处理
-
自适应阈值处理 能更好的处理明暗差异较大的图像
dst = cv2.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C)
maxValue 最大值
adaptiveMethod 自适应方法
thresholdType 阀值处理方式,只能是THRESH_BINARY,THRESH_BINARY_INV
blockSize 领域尺寸的块大小,通常3,5,7等
C 常量
-
Otsu处理 根据图像给出最佳的类间分割阈值
retval, dst = cv2.threshold(src,0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)
retval 返回的最优阀值
dst 阀值分割结果图像
图像平滑处理
-
均值滤波
dst = cv2.blur(src,ksize,anchor,borderType)
dst 滤波后的结果
src 待处理的图像
ksize 滤波核的大小,领域图像的高度和宽度,如(3,3)
anchor 锚点,默认(-1,-1),表示当前计算的均值点位于核的中心点位置,一般默认即可
borderType 边界样式,一般不用考虑取值,默认即可
-
方框滤波
dst = cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
dst 滤波后的结果
src 待处理的图像
ddepth 图像处理深度,一般用-1,表示与原图像同样深度
ksize 滤波核的大小,领域图像的高度和宽度,如(3,3)
anchor 锚点,默认(-1,-1),表示当前计算的均值点位于核的中心点位置,一般默认即可
normalize 是否进行归一化
borderType 边界样式,一般不用考虑取值,默认即可
-
高斯滤波 考虑权重
dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY,borderType)
sigmaX 卷积核在水平方向X的标准差
sigmaY 卷积核在垂直方向Y的标准差 ,为0,则只采用sigmaX的值,sigmaX也为0,则通过ksize自动计算
-
中值滤波
dst = cv2.medianBlur(src, ksize)
ksize 核大小,比1大的奇数,3,5,7…
-
双边滤波 有效保护图像内的边缘信息
dst = cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)
d 空间距离参数,表示以当前像素点为中心点的直径.为负数,自动从sigmaSpace计算得到,如果>5,速度较慢,一般推荐5,对于较大噪声的离线滤波,可以用9
sigmaColor 颜色差值范围,决定周围哪些像素点能够参与到滤波中来.小于sigmaColor的像素点可以参与,255都可以
sigmaSpace 坐标空间中的sigma值,越大越有更多的值参与运算.d>0时,d指定领域大小
-
2D卷积 自定义
dst = cv2.filter2D(src, ddepth,kernel,anchor,delta,borderType)
delta 修正值,可选项
以9*9大小领域进行均值滤波 1/81 kernel = np.ones((9,9),np.float32)/81
形态学操作
-
腐蚀 图像的边界点消除,向内收缩
dst = cv2.erode(src , kernel [, anchor [, iterations [, borderType[, borderValue]]]])
kernel 腐蚀操作的结构类型,可以自定,可以cv2.getStructuringElement()生成
anchor element结构中锚点的位置,默认(-1,-1),要核的中心位置
iterations 迭代次数,默认1
borderType 边界样式,默认BORDER_CONSTANT
borderValue 边界值,一般默认,C++中提供morphologyDefaultBorderValue()返回腐蚀和膨胀的magic边界值
-
膨胀 对图像边界扩张,还可以消除内部斑点
dst = cv2.dilate(src , kernel [, anchor [, iterations [, borderType[, borderValue]]]])
-
能用形态学函数
dst = cv2.morphologyEx(src ,op, kernel [, anchor [, iterations [, borderType[, borderValue]]]])
op cv2.MORPH_ERODE 腐蚀erode(src)
..DILATE 膨胀 dilate(src)
..OPEN 开运算 dilate(erode(src)) 用于去噪,分割,计数
..CLOSE 闭运算 erode(dilate(src)) 用于关闭前景内部小孔,去除物体上的小黑点,进行图像连接
..GRADIENT 梯度运算 dilate(src)-erode(src) 可以获得前景图像的边缘
..TOPATH 顶帽运算 src-open(src) 获取图像的噪声信息,或得到比原始图像边缘更亮的边缘信息
..BLACKHAT 黑帽运算 close(src) -src 获取图像内部小孔,或前景中的小黑点,,或得到比原始图像边缘更暗的边缘信息
..HITMISS 击中击不中 intersection(erode(src),erode(srcI))
-
构造核函数
retval = cv2.getStructuringElement(shape,ksize[,anchor])
shape 形状类型 cv2.MORPH_RECT 矩形结构元素,都是1 ..CROSS 十字形结构元素,对角线为1 .. ELLIPSE 椭圆形结构元素
ksize 结构元素的大小
anchor 结构中锚点的位置,默认(-1,-1),要核的中心位置
图形梯度 计算图形的边缘信息
-
sobel算子 在离散空间,可能不太准确
dst = cv2.Soble(src,ddepth,dx,dy[,ksize[,scale[,delta[,borderType]]]])
ddepth 输出图像的深度 输入图像的深度cv2.CV_8U ..16U/16S ..32F ..64F 输出深度为1/输入图像深度,再计算时为避免信息丢失,先设为cv2.CV_64F,再通过取绝对值映射为cv2.CV_8U.
dx x方向的求导阶数
dy y方向的求导阶数
x方向边缘,dx=1,dy=0 y方向边缘,dx=0,dy=1 ,xy方向重合的部分dx=1,dy=1 ,xy方向叠加cv2.addWeighted(),注意先取绝对值
ksize sobel核的大小.-1会使用Scharr算子进行运算
scale 缩放因子,默认为1,不缩放
delta 加在目标图上的值 ,默认为0
borderType 边界样式
-
取绝对值
dst = cv2.convertScaleAbs(src[, alpha[, beta]])
alpha 调节系数,默认为1
beta 调节亮度值,默认为0
-
Scharr算子 同样速度且精度更高
dst = cv2.Scharr(src,ddepth,dx,dy[,scale[,delta[,borderType]]])
ddepth 为cv2.CV_64F,再通过取绝对值映射为cv2.CV_8U
dx,dy x方向边缘,dx=1,dy=0 y方向边缘,dx=0,dy=1 ,xy方向叠加cv2.addWeighted(),只有这三种方式
-
Laplacian算子 具有旋转不变性,满足不同方向图像边缘检测的要求
dst = cv2.Laplacian(src,ddepth,[,ksize[,scale[,delta[,borderType]]]])
ksize 核尺寸大小,必须为正奇数
计算结果必须取绝对值才能保证正确
-
Canny边缘检测
edges = cv2.Canny(image,minThreshold,maxThreshold[,apertureSize[,L2gradient]])
edges 返回的边缘图像
image 8位输入图像
minThreshold 第一个小的阈值
maxThreshold 第二个大的阈值 minThreshold,maxThreshold较小时能检测更多的结果
apertureSize Sobel算子的孔径大小
L2gradient 计算梯形副度的标识,默认为False,使用L1范数计算,为True时使用更精确的L2范数计算
图像金字塔
-
高斯金字塔 向下采样
dst = cv2.pyrDown(src[,dstsize[,borderType]])
dstsize 目标图像大小,默认情况下输出大小为Size((src.cols+1)/2,(src.rows+1)/2)
borderType 办界类型,仅支持BORDER_DEFAULT
-
高斯金字塔 向上采样
dst = cv2.pyrUp(src[,dstsize[,borderType]])
dstsize 目标图像大小,默认情况下输出大小为Size(src.cols2,src.rows2)
borderType 办界类型,仅支持BORDER_DEFAULT
两个方向操作不可逆
-
拉普拉斯金字塔 可获得采样过程中丢失的信息
Li = Gi – pyrUp(Gi+1)
Li 拉普拉斯金字塔的第i层
Gi 高斯金字塔的第i层
图像轮廓
-
查找图像轮廓
image, contours, hierarchy = cv2.findContours(image, mode, method)
CV4 contours, hierarchy = cv2.findContours(image, mode, method)
contours 返回的轮廓数组
hierarchy 轮廓的层次关系
image 必须是8位单通道二值图像
mode cv2.RETR_EXTERNAL 只检测外轮廓 cv2.RETR_LIST不建立等级关系cv2.RETR_CCOMP 两级层次结构 cv2.RETR_TREE 建立等级树的层次结构
-
绘制图像轮廓
image = cv2.drawContours(image,contours,contourIdx,color[,thickness[,lineType[,hierarchy[,maxLevel[,offset]]]]])
contours 图像轮廓
contourIdx 轮廓索引 -1绘制全部轮廓
color 绘制颜色
thickness 画笔粗细 -1绘制实心轮廓,即特定对象的掩模
lineType 绘制的线型
hierarchy 轮廓的层次关系
maxLevel 轮廓的层次深度 0仅绘制第0层,其它非0整数,绘制最高层及以下相同数量层级的轮廓
offset 偏移参数,将轮廓偏移到不同的位置展示出来
-
轮廓矩特征 用来比较两个轮廓是否相似
retval = cv2.moments(array[,binaryImage])
array 可以是点集,灰度图,二值图
binaryImage 为True时,array所有非零值都被处理为1,此值仅在array为图像时有效
retval 特征矩 空间矩:零阶矩m00表示轮廓的面积 中心矩: 归一化中心矩:
-
计算轮廓的面积
retval = cv2.contourArea(contour[,oriented])
contour 轮廓
oriented 默认False,返回绝对值 为True是返回值包含正负号,表示轮廓是顺时针还是逆时针的
-
计算轮廓的长度
retval = cv2.arcLength(contour,closed)
contour 轮廓
closed True/False 轮廓是否封闭
-
Hu矩–用来识别图像的特征
hu = cv2.HuMoments(m);
hu h0~h6
m cv2.moments计算得到的矩特征值
-
形状匹配
retval = cv2.matchShapes(contour1,contour2,method,parameter)
contour1 contour2 两个轮廓或者灰度图像
method 比较方法 cv2.CONTOURS_MATCH_I1(2/3)
parameter 扩展参数到CV4.1.0暂都不支持,应设为0
-
轮廓拟合-矩形包围框
retval = cv2.boundingRect(array)
x,y,w,h = cv2.boundingRect(array)
retval x,y,w,h 矩形边界左上角顶点坐标值及边界的宽度和高度
array 灰度图像或轮廓
-
轮廓拟合-最小包围矩形框
retval = cv2.minAreaRect(points)
retval (最小外接矩形的中心(x,y),(宽度,高度),旋转角度)
points 轮廓
retval返回值不符合cv2.drawContours参数结构,需使用cv2.boxPoints()转换
-
转换轮廓 获取最小包围矩形框的四个顶点坐标
points = cv2.boxPoints(box)
points 能使用cv2.drawContours绘制的轮廓点
box cv2.minAreaRect的返回值
-
轮廓拟合-最小包围圆形
center, radius = cv2.minEnclosingCircle(points)
(x,y), radius = cv2.minEnclosingCircle(points)
center 最小包围圆形的中心
radius 半径
points 轮廓
-
轮廓拟合-最优拟合椭圆
retval = cv2.fitEllipse(points)
retval 是RotatedRect类型,包括质心,宽,高,旋转角度等信息
points 轮廓
-
轮廓拟合-最优拟合直线
line = cv2.fitLine(points,distType,param,reps,aeps)
[vx,vy,x,y] = cv2.fitLine(points,distType,param,reps,aeps)
points 轮廓
distType 距离类型,要使输入点到拟合直线的距离之和最小,如下:
cv2.DIST_USER/L1/L2/C/L12/FAIR/WELSCH/HUBER
param 距离参数 与所选距离类型有关, 为0时自动选择最优
reps 径向精度,通常设为0.01
aeps 角度精度,通常设为0.01
-
轮廓拟合-最小外包三角形
retval,triangle = cv2.minEnclosingTriangle(points)
retval 最小外包三角形的面积
triangle 最小外包三角形的三个顶点
-
轮廓拟合-逼近多边形-采用的是DP算法
approxCurve = cv2.approxPolyDP(curve,epsilon,closed)
approxCurve 逼近多边形的点集
curve 轮廓
epsilon 精度 原始轮廓的边界点与逼近多边形边界之间的最大距离,通常设为多边形总长度的百分比形式
closed True/False 多边形是否封闭的
-
凸包
hull = cv2.convexHull(points[,clockwise[,returnPoints]])
points 轮廓
clockwise True/False 凸包角点按顺时针或逆时针方向排列
returnPoints True/False 默认为True,返回凸包角点的x/y坐标,反之返回角点的索引
-
绘制凸包
cv2.polylines(image,[hull],True,(0,255,0),2)
-
凸缺陷-凸包与轮廓之间的部分
convexityDefects = cv2.convexityDefects(contour,convexhull)
convexityDefects 凸缺陷点集,一个数组[起点,终点,轮廓上距离凸包最远的点,最远的点到凸包的近似距离],前三个值为索引,需要到轮廓点中查找
contour 轮廓
convexhull 凸包 returnPoints的值必须是False
-
检测轮廓是否是凸形
retval = cv2.isContourConvex(contour)
retval True/False 是否凸形
contour 要判断的轮廓
-
点到轮廓的距离,或点和多边形的关系测试
retval = cv2.pointPolygonTest(contour,pt,measureDist)
contour 轮廓
pt 待判定的点
measureDist 判定的方式:True计算点到轮廓的距离,点在轮廓的外部返回负值,在轮廓上返回0,在内部,返回正数, False只返回-1,0,1中的一个值
-
计算形状场景距离-构造距离提取算子
retval = cv2.createShapeContextDistanceExtractor([,nAngularBins[,nRadialBins[,innerRadius[,outerRadus[,iterations[,comparer[,transformer]]]]]]])
nAngularBins 角容器的数量
nRadialBins 径向容器的数量
innerRadius 内半径’
outerRadus 外半径
iterations 迭代次数
comparer 直方图代价提取算子
transformer 形状变换参数
-
计算不同形状场景距离
retval = cv2.createShapeContextDistanceExtractor.computeDistance(contour1,contour2)
contour1,contour2 是不同的轮廓
-
计算Hausdorff距离-构造距离提取算子
retval = cv2.createHausdorffDistanceExtractor([,distanceFlag[,rankProp]])
distanceFlag 距离标记
rankProp 比例值0~1之间
-
轮廓的特征值
宽高比 = 宽度/高度
Extend = 轮廓面积(对象面积)/矩形边界面积
Solidity = 轮廓面积(对象面积)/凸包面积
Equivalent Diameter等效直径 = Sqrt(4*轮廓面积/PI)
方向 = (x,y),(MA,ma),angle = cv2.fitEllipse(cnt) 利用椭圆方向
-
获取掩模
参见cv2.drawContours绘制轮廓将参数thickness设为-1
-
使用Numpy函数获取轮廓像素点
使用numpy.nonzero()找出数组内非0元素的位置,返回值是将行列分别显示
再使用numpy.transpose()处理上述结果,得到这些点的(x,y)坐标
-
使用OpenCV函数获取轮廓点
idx = cv2.findNonZero(src)
idx 非0元素的索引位置,每个元素对应的是(列号,行号)格式
src 要查找的非零元素的图像
-
最大值最小值及其位置
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(imgray,mask=mask)
min_val,max_val 最小值,最大值
min_loc,max_loc 最小值,最大值的位置
imgray 单通道图像,灰度图像
mask 掩模
-
平均颜色及平均灰度
mean_val = cv2.mean(im,mask = mask) 能够计算各个通道的均值
im 原图像
mask 掩模
-
极点
leftmost = tuple(cnt[cnt[:,:,0].argmin()][0]) 最左端点
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0]) 最右端点
topmost = tuple(cnt[cnt[:,:,1].argmin()][0]) 最上端点
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0]) 最下端点
直方图处理
-
绘制直方图-matplotlib.pyplot.hist()
matplotlib.pyplot.hist(x,BINS)
x 数据源
BINS BINS值,灰度级的分组情况
-
二维数组降为一维数组
b = a.ravel()
-
绘制直方图-cv2.calcHist
hist = cv2.calcHist(images,channels,mask,histSize,ranges,accumulate)
hist 统计直方图,一维数组
images 原始图像,需用[]括起来
channels 通道编号,需用[]括起来,单通道灰度图为0,彩色图0,1,2,对应B,G,R
mask 掩模图像
histSize BINS的值,需用[]括起来
ranges 像素值的范围,如8位灰度图像素值[0,255]
accumulate 默认False,累计/叠加标识,为True时直方图开始计算时不清零,用于一组图像计算,实时更新直方图,从多个对象中计算单个直方图,一般不用设置
-
matplotlib.pyplot.plot 直方图绘图
plt.plot(x,y,color=’r’) 省略x轴时默认生成与y长度一致的自然序数
-
直方图均衡化,综合考虑了统计概率和HVS的均衡化
dst = cv2.equalizeHist(src)
src 8位单通道原始图像
-
matplotlib.pyplot.subplot 向当前窗口添加一个子窗口对象
matplotlib.pyplot.subplot(nrows,ncols,index)
-
matplotlib.pyplot.imshow 显示窗口,注意openCV的通道顺序BGR
matplotlib.pyplot.imshow(X, cmap=None)
X 图像信息
cmap 色彩空间 默认null RGB(A)色彩空间
-
matplotlib.pyplot.figure 构建窗口
matplotlib.pyplot.figure(‘text’)
-
matplotlib.pyplot.axis 关闭/显示坐标轴
matplotlib.pyplot.axis(‘off’)
傳里叶变换
-
numpy实现傳里叶变换
retval = numpy.fft.fft2(原始灰度图像)
retval 复数数组的频谱信息
-
零频率成分移动到频域图像中心位置
retval = numpy.fft.fftshift(原始频谱)
-
频谱信息转换到[0,255]的灰度空间图
像素新值 = 20*np.log(np.abs(频谱信息值))
-
零频率成分移动到频域图像中心位置的反向操作,移回原位
retval = numpy.fft.ifftshift(原始频谱)
-
numpy实现逆傳里叶变换
retval = numpy.fft.ifft2(频域数据)
retval 复数数组的空域信息
-
空域信息转换到[0,255]的灰度空间图
像素新值 = np.abs(空域信息)
-
高通滤波,增加图中尖锐细节,保留边缘信息,低通滤波使图像变模糊
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
rows, cols = img.shape
crow, ccol = int(rows/2), int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
ishift2 = np.fft.ifftshift(fshift)
iimg2 = np.fft.ifft2(ishift2)
iimg2 = np.abs(iimg2)
-
opencv实现傳里叶变换
rstval = cv2.dft(原始图像,转换标识)
rstval 返回结果与nupmy转换一致,但是双通道,1通道为实数部分,2通道为虚数部分,再使用numpy.fft.fftshift(rstval)移到中心位置,再计算频谱信息的幅度,然后再20*np.log(),得到频谱信息
原始图像 要先使用np.float32()转换格式
转换标识 通常为cv2.DFT_COMPLEX_OUTPUT输出一个复数阵列
-
计算频谱信息的幅度
rstval = cv2.magnitude(实部,虚部)
-
将幅度值映射为灰度空间[0,255]
20*np.log(rstval)
-
opencv实现逆傳里叶变换
rstval = cv2.dft(频域数据)
频域数据 如果先前移动了零频率分量,在使用前要先ifftshift移回原位置
-
低通滤波
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dftshift = np.fft.fftshift(dft)
rows, cols = img.shape
crow, ccol = int(rows/2), int(cols/2)
mask = np.zeros((rows, cols, 2), np.uint8)
.# 两个通道,与频域图像匹配
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
fshift = dftshift * mask
ishift = np.fft.ifftshift(fshift)
iimg2 = cv2.idft(ishift)
iimg2 = cv2.magnitude(iimg2[:, :, 0], iimg2[:, :, 1])
模版匹配
-
模版匹配
rstval = cv2.matchtemplate(image, templ, method[,mask])
rstval 比较结果集,单通道32位浮点型,原始图大小WH,模版大小wh,返回值大小(W-w+1)*(H-h+1),前两种返回0最匹配,其它值越大越匹配,查极值
image 原始图像8位或32位的浮点型图像
templ 模版图像,小于或等原始图像,与它具有相同的类型
method 匹配方法cv2.TM_SQDIFF/TM_SQDIFF_NORMED/TM_CCPRR/TM_CCORR_NORMED/TM_CCOEFF/TM_CCOEFF_NORMED
mask 模版图像掩模,和ermpl具有相同的大小和类型,通常默认值即可,仅支持TM_SQDIFF/TM_CCORR_NORMED
-
查找最值(极值)与所在的位置
minVal,maxVal,minLoc,maxLoc = cv2.minMaxLoc(src[,mask])
minVal,maxVal,minLoc,maxLoc 极值与位置,可以为NULL
src 单通道数据
mask 掩模的子集
-
*取模版图像的宽高时语句
th,tw = template.shape[::]
tw,th = template.shape[::-1]
-
多模版匹配
loc = np.where(res >= threshold) 能够获取模版匹配位置的集合
threshold 预设阀值
遍历位置
for i in zip(模版匹配索引集合)
行列位置互换
loc[::-1]
标记各个匹配位置
for pt in zip(loc[::-1])
cv2.rectangle(img,pt,(pt[0]+w, pt[1]+h), 255, 1)
霍夫变换
-
霍夫直线变换
lines = cv2.HoughLines(image,rho,theta,threshold)
lines 中每个元素都是一对浮点数,表示检测到的直线参数即(r,0)
image 源图像8位单通道的二值图像
rho 以像素为单位的距离r的精度,一般为1
theta 角度0的精度,一般pi/180,表示搜索所有可能的角度
threshold 阀值,越小判定出的直线越多
-
概率霍夫直线变换
lines = cv2.HoughLinesP(image,rho,theta,threshold,minLineLength,maxLineGap)
lines 中每个元素都是一对浮点数,表示检测到的直线参数即(r,0)
image 源图像8位单通道的二值图像
rho 以像素为单位的距离r的精度,一般为1
theta 角度0的精度,一般pi/180,表示搜索所有可能的角度
threshold 阀值,越小判定出的直线越多
minLineLength 接受直线的最小长度,默认0
maxLineGap 接受共线线段之间的最小间隔,即一条线段两点的最大间隔
-
霍夫圆环变换,在使用前先进行平滑操作,减少噪声,避免误判
circles = cv2.HoughCircles(image,method,dp,minDist,param1,param2,minRadius,maxRadius)
image 源图像8位单通道的灰度图像
method 检测方法,目前只有HOUGH_GRADIENT两轮检测
dp 累计器分辨率,分隔比率,为1表示输入图像与累加器有相同的分辨率
minDist 圆心间的最小间距,被作为阀值使用
param1 默认100,对应Canny边缘检测器的高阀值(低阀值是高阀值的1/2)
param2 圆心位置必须收到的投票数,值越大,检测到的圆越少,默认100
minRadius圆半径的最小值,默认为0,参数不起作用
maxRadius 圆半径的最大值,默认为0,参数不起作用
图像分隔与提取
分水岭算法cv2.watershed(),形态学函数(各个子图没有连接时),距离变换函数cv2.distanceTransform(),cv2.connectedComponents()
形态学函数用于简单的图像
- 距离变换函数 获得前景图像的中心,得到确定前景,还能细化轮廓等多种功能
dst = cv2.distanceTransform(src,distanceType,maskSize[,dstType])
dst 计算得到图像,8位或32浮点数,尺寸与src相同
src 源图像8位单通道的二值图像
distanceType 距离类型参数cv2.DIST_USER/DIST_L1/DIST_L2/DIST_C/DIST_L12/DIST_FAIR/DIST_WELSCH/DIST_HUBER
maskSize 掩模尺寸cv2.DIST_MASK_3/DIST_MASK_5/DIST_MASK_PRECISE,当类型为DIST_L1/DIST_C时强制为3
dstType 目标图像类型,默认CV_32F
未知区域UN = (图像O-确定背景B) – 确定前景
(图像O-确定背景B) 可用图像进行形态学膨胀操作得到
- 前景图像标注 背景标注为0,其它对像从1开始正数标注
retval, labels = cv2.connectedComponents(image)
retval 返回标注的数量
labels 标注的结果图像
image 为8位单通道待标注图像
为适应分水岭算法,标注的结果都加上数值1,未知区域标注0
ret, markers = cv2.connectedComponents(fore)
markers = markers + 1
markers[未知区域] = 0
-
分水岭算法图像分隔
markers = cv2.watershed(image,markers)
image 8位三通道图像,在处理前先用正数大致勾画出图像期望分隔的区域
markers 32位单通道的标注结果,和image具有相等大小,-1为边界
具体使用
# 转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# OTSU阈值处理
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 开运算,对原始图像去噪
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel=kernel, iterations=2)
# 对过膨胀,得到确定背景B
sure_bg = cv2.dilate(opening, kernel, iterations=3)
# 利用距离变换,并对其阈值处理,得到确定前景F
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
# 确定前景F 阈值处理
ret, sure_fg = cv2.threshold(dist_transform, 0.7*dist_transform.max(), 255, 0)
sure_fg = np.uint8(sure_fg)
# 计算未知区域UN
unknown = cv2.subtract(sure_bg, sure_fg)
# 对原图像O进行标注
ret, markers2 = cv2.connectedComponents(sure_fg)
# 对标注结果进行修正,适应分水岭算法,将未知区域标注为0
markers2 = markers2 + 1
markers2[unknown == 255] = 0
# 使用分水岭函数进行图像的分割
markers3 = cv2.watershed(img2, markers2)
# 显示彩色分割标记 -1表示边界
img2[markers3 == -1] = [0, 255, 0]
- 交互式前景提取
mask, bgModel, fgModel = cv2.grabCut(img, mask, rect, bgModel, fgModel, iterCount[, mode])
img 8位3通道
mask 掩模图像,8位单通道,用于确定区域,确定背景0,确定前景1,可能背景2,可能前景3
rect 包含前景对象的区域,只有当mode为cv2.GC_INIT_WITH_RECT才有作用,使用掩膜时设为none
bgModel, fgModel 算法内部使用的数组,只需创建(1,65)大小的numpy.float64数组
iterCount 迭代次数
mode 迭代模式 cv2.GC_INIT_WITH_RECT矩形模版,cv2.GC_INIT_WITH_MASK自定义,能与矩形组合使用,cv2.GC_EVAL修复模式,cv2.DC_EVAL_FREEZE_MODEL固定模式
视频处理
- 摄像头初始化
cap = cv2.VideoCapture(摄像头ID或文件名)
-
判断摄像头是否初始化成功
retval = cv2.VideoCapture.isOpened()
retval True成功 False失败
-
初始化失败后打开摄像头
retval = cv2.VideoCapture.open(摄像头ID或文件名)
-
捕获帧
retval, img = cap.read()
img 捕获到的帧,没有为空
retval True成功 False失败
-
关闭摄像头
None= cv2.VideoCapture.cap.release()
-
摄像头属性获取
retval = cv2.VideoCapture.cap.get(propid)
propid 对象属性 cv2.CAP_PROP_FRAME_WIDTH 宽3 cv2.CAP_PROP_FRAME_HEIGHT 高4 FYI P385
-
摄像头属性设置
retval = cv2.VideoCapture.cap.get(propid, value)
-
捕获多个摄像头数据
retval = cv2.VideoCapture.grab() 指向下一帧
retval True False 是否成功指向下一帧
下一步
retval, image = cv2.VideoCapture.retrieve() 解码并返回一帧
retval True False 是否成功
image 返回的视频帧,失败为空图像
-
VideoWriter 保存视频文件,修改视频属性,类型转换等
= cv2.VideoWriter(filename,fourcc, fps, frameSize[,isColor])
filename 输出目标视频的文件路径和文件名
fourcc 视频编码/解码类型 -1为弹窗口选择
fps 帧速率
frameSize 每帧的长和宽
isColor 是否彩色图像
-
写入下一帧视频
None = cv2.VideoWriter(image)
-
释放
None = cv2.VideoWriter.release()
out.release()
-
指定视频编/解码格式
cv2.VideoWriter_fourcc(4个字符参数) ‘I’,’4′,’2′,’0′ 未压缩YUV的.avi ‘X’,’V’,’T’,’D’ MPEG-4的.avi 更多参见www.fourcc.org
绘图交互
img 载体图像,画布,画板
color 绘制颜色,注意是BGR,灰度图像只能传入灰度值
thickness 线条粗细,-1 表示填充为实心
lineType 张条类型,默认是8连接类型
shift 数据精度,一般不用设置
- 绘制线条
img = cv2.line(img,pt1,pt2,color,thickness[,lineType])
-
绘制矩形
img = cv2.rectangle(img,pt1,pt2,color[,thickness[,lineType]])
-
绘制圆形
img = cv2.circle(img,center,radius,color[,thickness[,lineType]])
center 圆心
radius 半径
-
绘制椭圆
img = cv2.ellipse(img,center,axes,angle,startAngle,endAngle,color[,thickness[,lineType]])
center 圆心
axes 轴的长度
angle 偏转的角度
startAngle 圆弧起始角的角度
endAngle 圆弧终结角的角度
-
绘制多边形
img = cv2.polylines(img,pts,isClosed,color[,thickness[,lineType[,shift]]])
pts 多边形的各个顶点 数组类型为numpy.int32
isClosed 闭合标记
-
图形上绘制文字
img = cv2.putText(img,text,org,fontFace,fontScale,color[,thickness[,lineType[,bottomLeftOrigin]]])
text 绘制的文字
org 绘制的文字位置,以文字的左下角为起点
fontFace 字体类型,cv2.FONT_HESRESHEY_SIMPLEX …
fontScale 字体大小
bottomLeftOrigin 控制文字的方向 默认False,True时垂直镜像的效果
-
鼠标交互
定义响应函数
def OnMouseAction(event,x,y,flags,param):
OnMouseAction 响应函数名,可自定
event 鼠标事件
x,y 鼠标触发事件时,鼠标在窗口中的坐标
flags 鼠标的拖拽事件,及键盘鼠标的联合事件
param 标识所响应的事件函数
函数与窗口绑定
cv2.setMouseCallback(winname,onMouse)
winname 绑定的窗口名
onMouse 响应的函数名
查看opencv所支持的鼠标事件
events = [i for in dir(cv2) if ‘EVENT’ in i]
print(events)
创建窗口
cv2.namedWindows(‘name’)
- 滚动条 Trackbar
cv2.createTrackbar(trackbarname,winname,vlaue,count,onChange)
trackbarname 滚动条名称
winname 绑定的窗口名
vlaue 初始值,决定滚动条中滑块的位置
count 滚动条取大值,通常最小值为0
onChange 回调函数
-
获取滚动条的值
retval = getTrackbarPos(trackbarname,winname)
当作开关使用时,滚动条只有两种值0,1
k邻近算法 cv2.KNearest()
knn = cv2.ml.KNearest_create()
knn.train(trainData,cv2.ml.ROW_SAMPLE,tdLable)
ret,results,neighbours,dist = knn.findNearest(dst,k)
ret
results 可以判定的类型
neighbours 距离当前最近的k个邻居
dist k个最近邻居的距离
支持向量机SVM 基于关键点的分类算法
sk-learn库,LIBSVM库…
生成用于后续训练的空分类器模型
svm = cv2.ml.SVM_create()
训练结果 = svm.train(训练数据,训练数据排列格式,训练数据的标签)
训练数据排列格式 cv2.ml.ROW_SAMPLE 按行 cv2.ml.COL_SAMPLE 按列
(返回值,返回结果) = svm.predict(测试数据)
参数调整:setType()设置类别 setKernel()设置核类型 setC()设置支持向量机的参数C(惩罚系数,对误差的宽容度,默认0)
K均值聚类 无监督学习
retval,bestLabels,centers = cv2.kmeans(data,K,bestLables,criteria,attempts,flags)
retval 距离值,返回每个点到相应中心距离的平方和
bestLabels 各个数据点的最终分类标签(索引)
centers 每个分类的中心点数据
data 待处理的数据集合,np.float32类型,每个特征单独一列中
K 要分出簇的个数,常见2,表示2分类
bestLables 各个数据点的最终分类标签(索引),实际中设为None
criteria 算法迭代的终止条件,达到最大循环数目和指定精度阀值时终止,由3个参数构成type,max_iter,eps
type: cv2.TEEM_CRITERIA_EPS 精度满足 MAX_ITER 迭代次数超过阀值max_iter时停止 _EPS+MAX_ITER两个任意一个满足停止
max_iter 最大迭代次数
eps 精确度的阀值
attempts 使用不用的初始值多次(attempts次)偿试
flags 选择初始中心点的方法,主要有3种cv2.KMEANS_RANDOM_CENTERS 随机 cv2.KMEANS_PP_CENTERS基于中心算法 cv2.KMEANS_USE_INITIAL_LABELS 使用用户输入的数据作为第一次分类的中心点,需要多次偿试时后续使用随机或半随机值作为第一次分类中心点
人脸识别
- Haar级联分类器 hog级联分类器(用于行人检测) LBP级联分类器
训练级联分类器
在opencv根目录\bulid\x86\vc12\bin中的opencv_createsamples.exe opencv_traincascade.exe
自带的分类器
在opencv源文件的data文件夹下三个子文件夹
加载级联分类器
= cv2.CascadeClassifier(filename)
在anaconda使用pip安装opencv无法直接获得分类器的xml文件,可在opencv安装目录\data或网上下载相应的xml文件
级联人脸检测使用
objects = cv2.CascadeClassifier.detectMultiScale(image[,scaleFactor[,minNeighbors[,flags[,minSize[,maxSize]]]]])
objects 目标对像的矩形框向量组
image 待检测图像,通常灰度图像
scaleFactor 在前后前后两次相继的扫描中搜索窗口的缩放比例
minNeighbors 构成检测目标的相邻矩形的最小个数,默认为3,提高检测的准确率可设得更大,但可能让一些人脸无法被检测到
flags 能常补省略,在低版1.X时,可能被设置为CV_HAAR_DO_CANNY_RUNNING 表示用canny边缘检测器来拒绝一些区域
minSize 目标的最小尺寸,小于会补忽略
maxSize 目标的最大尺寸,大于会补忽略
- 人脸识别:LBPH,EigenFishfaces,fisherfaces
LBPH 局部二值模式直方图
1生成LBPH识别器实例模型
retval = cv2.face.LBPHFaceRecognizer_create([,radius[,neighbors[,grid_x[,grid_y[,thershold]]]]])
radius 半径值,默认为1
neighbors 领域点的个数,默认8
grid_x 特征图划分为一个个单元格时,每个单元格在水平方向上的像素个数,默认8
grid_y 特征图划分为一个个单元格时,每个单元格在垂直方向上的像素个数,默认8
thershold 在预测时所使用的阀值,大于此阀值就认为没有识别到任何目标
2 对每个参考图计算LBPH,得到一向量,每个人的脸都是整个向量的一个点,完成训练
None = cv2.face_FaceRecognizer.train(src, labels)
src 训练图像,用来学习的人脸图像
labels 人脸图像所对应的标签
3检测识别
label, confidence = cv2.face_FaceRecognizer.predict(src)
label 返回的识别结果标签
confidence 返回的置信度评分,0完全匹配,小于50可以接受,大于80差别较大
src 需要识别的图像
EigenFishfaces特征脸,使用成分分析PCA,操作过程中会损失许多特征信息
1生成特征脸识别器实例模型
retval = cv2.face.EigenFaceRecognizer_create([,num_components[,threshold]])
num_components PCA中要保留的分量个数,一般80个就够了
threshold 人脸识别的阀值
2对每个参考图计算,得到一向量,每个人的脸都是整个向量的一个点,完成训练
None = cv2.face_EigenFaceRecognizer.train(src,labels)
src 训练图像,用来学习的人脸图像
labels 人脸图像所对应的标签
3检测识别
label, confidence = cv2.face_EigenFaceRecognizer.predict(src)
label 返回的识别结果标签
confidence 返回的置信度评分,0完全匹配,小于5000可以认为是可靠的,最大值20000
src 需要识别的图像
fisherfaces 线性判断分析LDA
1生成识别器实例模型
retval = cv2.face.FisherFaceRecognizer_create([,num_components[,threshold]])
num_components 线性分析时要保留的分量个数,可设为0,函数自动设置
threshold 识别的阀值,如果最近的距离比设定的阀值还要大,函数返回-1
2对每个参考图计算,得到一向量,每个人的脸都是整个向量的一个点,完成训练
None = cv2.face_FisherFaceRecognizer.train(src,labels)
src 训练图像,用来学习的人脸图像
labels 人脸图像所对应的标签
- 检测识别
label, confidence = cv2.face_EigenFaceRecognizer.predict(src)
label 返回的识别结果标签
confidence 返回的置信度评分,0完全匹配,小于5000可以认为是可靠的,最大值20000
src 需要识别的图像
人脸数据库
-
CAS-PEAL
1040位99594幅人脸图像,开放了子集 CAS-PEAL_R1 1040人的30900幅图像
-
AT&T Facedatabase
即以前的ORL,40个人400幅
-
Yale Facedatabase A
耶鲁人脸数据库,15*11
-
Extend Yale Facedatabase B
扩展耶鲁人脸数据库B 28964 16128张
-
color FERET Database
1564组,共14126张,由1199个不同拍摄对像重复拍摄,最广泛之一
-
人脸数据库整理网站
opencv推荐 http://face-rec.org/database