存档2020年7月20日

opencv python

  1. 读取图像
    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

  2. 显示图像
    None = cv2.namedWindow(winname) 创建指定名的窗口
    None = cv2.imshow(winname,img)

  3. 等待按键
    retval = cv2.waitKey([delay])
    retval 按键返回值按键的ASCII码,没有按键-1
    delay 等待键盘触发时间ms,0或负数,一直等待,默认0

  4. 获取字符的ASCII码值
    ord(“A”)

  5. 销毁指定的窗口
    None = cv2.destroyWindow(winname)

  6. 销毁所有的窗口
    None = cv2.destroyAllWindow()

  7. 保存图像
    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通道

  1. 常用数据生成
    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)

  2. numpy.array更快的访问像素
    item(行,列)
    itemset(索引值,新值) 索引值=(行,列)

  3. 感兴趣区域ROI
    img[200:400,200:400]

  4. 通道拆分
    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]

  1. 通道合并
    bgr = cv2.merge([b,g,r])

  2. 获取图像的属性
    img.shape 返回行数,列数,通道数,如是二值图或灰度图,只有行列数
    img.size 返回像素数目,行数列数通道数,如是二值图或灰度图,通道数为1
    img.dtype 返回图像的数据类型

  3. 图像的加法
    a+b的和除以256
    cv2.add(a,b[,mask]) 和大于255,取值255

  4. 图像加权和
    dst = cv2.addWeighted(src1,alpha,src2,beta,gamma)
    dst=src1alpha+src2beta+gamma

  5. 按位与
    dst = cv2.bitwise_and(src1,src2[,mask])
    mask 8位单通道array值,常用于保留掩模内的图像

  6. 按位或
    dst = cv2.bitwise_or(src1,src2[,mask])

  7. 按位异或
    dst = cv2.bitwise_xor(src1,src2[,mask])

  8. 按位取反 非
    dst = cv2.bitwise_not(src1,src2[,mask])

  9. 位平面分解
    阀值处理
    mask = img[:,:,i]>0 将图像中大于0的值处理为True <=0的处理为 False
    img[mask] = 255 将True替换为255,False替换为0
    opencv提像了专门的阀值处理函数cv2.threshold()

  10. 图像加解密,水印
    加密: 明文A与密钥B异或,得到密文C
    解密:密文C与密钥B异或,得到明文A
    水印在最低有效位LSB隐藏信息,对整体图像影响不明显


色彩空间类型转换

类型转换
dst = cv2.cvtColor(src, code[,dstCn])
dst 转换后的图像,与原图具有同样的数据类型各深度
src 要转换的原图
code 色彩空间转换码
dstCn 目标通道数,默认0,自动通过原始输入图和code得到

更多类型查看官网

  1. 锁定特征值,可提取特定颜色
    dst = cv2.inRange(src, lowerb,upperb)
    dst 输出结果,大小和src一致,如果值在区间内,dst对应位置为255,否则为0,可以作为一个掩码数组
    src 要检查的图像或数组
    lowerb 范围下界
    upperb 范围上界

  2. alpha通道
    RGBA色彩空间4通道,alpha通道值[0,1]或[0,255]表示从透明到不透明


几何变换

  1. 缩放
    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插值效果不错(快)

  2. 翻转
    dst = cv2.flip(src, flipCode)
    flipCode 旋转类型0绕着X轴翻转,正数绕着y轴,负数绕着x,y轴同时翻转

  3. 仿射
    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 输出图像的三个顶点坐标

  4. 透视变换,可以将矩形应射为任意四边形
    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 输出图像的四个顶点坐标

  5. 重映射
    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
    可以实现复制,翻转,缩放等操作


阀值处理

  1. 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 低阈值零处理

  2. 自适应阈值处理 能更好的处理明暗差异较大的图像
    dst = cv2.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C)
    maxValue 最大值
    adaptiveMethod 自适应方法
    thresholdType 阀值处理方式,只能是THRESH_BINARY,THRESH_BINARY_INV
    blockSize 领域尺寸的块大小,通常3,5,7等
    C 常量

  3. Otsu处理 根据图像给出最佳的类间分割阈值
    retval, dst = cv2.threshold(src,0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    retval 返回的最优阀值
    dst 阀值分割结果图像


图像平滑处理

  1. 均值滤波
    dst = cv2.blur(src,ksize,anchor,borderType)
    dst 滤波后的结果
    src 待处理的图像
    ksize 滤波核的大小,领域图像的高度和宽度,如(3,3)
    anchor 锚点,默认(-1,-1),表示当前计算的均值点位于核的中心点位置,一般默认即可
    borderType 边界样式,一般不用考虑取值,默认即可

  2. 方框滤波
    dst = cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
    dst 滤波后的结果
    src 待处理的图像
    ddepth 图像处理深度,一般用-1,表示与原图像同样深度
    ksize 滤波核的大小,领域图像的高度和宽度,如(3,3)
    anchor 锚点,默认(-1,-1),表示当前计算的均值点位于核的中心点位置,一般默认即可
    normalize 是否进行归一化
    borderType 边界样式,一般不用考虑取值,默认即可

  3. 高斯滤波 考虑权重
    dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY,borderType)
    sigmaX 卷积核在水平方向X的标准差
    sigmaY 卷积核在垂直方向Y的标准差 ,为0,则只采用sigmaX的值,sigmaX也为0,则通过ksize自动计算

  4. 中值滤波
    dst = cv2.medianBlur(src, ksize)
    ksize 核大小,比1大的奇数,3,5,7…

  5. 双边滤波 有效保护图像内的边缘信息
    dst = cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)
    d 空间距离参数,表示以当前像素点为中心点的直径.为负数,自动从sigmaSpace计算得到,如果>5,速度较慢,一般推荐5,对于较大噪声的离线滤波,可以用9
    sigmaColor 颜色差值范围,决定周围哪些像素点能够参与到滤波中来.小于sigmaColor的像素点可以参与,255都可以
    sigmaSpace 坐标空间中的sigma值,越大越有更多的值参与运算.d>0时,d指定领域大小

  6. 2D卷积 自定义
    dst = cv2.filter2D(src, ddepth,kernel,anchor,delta,borderType)
    delta 修正值,可选项
    以9*9大小领域进行均值滤波 1/81 kernel = np.ones((9,9),np.float32)/81


形态学操作

  1. 腐蚀 图像的边界点消除,向内收缩
    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边界值

  2. 膨胀 对图像边界扩张,还可以消除内部斑点
    dst = cv2.dilate(src , kernel [, anchor [, iterations [, borderType[, borderValue]]]])

  3. 能用形态学函数
    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))

  4. 构造核函数
    retval = cv2.getStructuringElement(shape,ksize[,anchor])
    shape 形状类型 cv2.MORPH_RECT 矩形结构元素,都是1 ..CROSS 十字形结构元素,对角线为1 .. ELLIPSE 椭圆形结构元素
    ksize 结构元素的大小
    anchor 结构中锚点的位置,默认(-1,-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 边界样式

  2. 取绝对值
    dst = cv2.convertScaleAbs(src[, alpha[, beta]])
    alpha 调节系数,默认为1
    beta 调节亮度值,默认为0

  3. 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(),只有这三种方式

  4. Laplacian算子 具有旋转不变性,满足不同方向图像边缘检测的要求
    dst = cv2.Laplacian(src,ddepth,[,ksize[,scale[,delta[,borderType]]]])
    ksize 核尺寸大小,必须为正奇数
    计算结果必须取绝对值才能保证正确

  5. Canny边缘检测
    edges = cv2.Canny(image,minThreshold,maxThreshold[,apertureSize[,L2gradient]])
    edges 返回的边缘图像
    image 8位输入图像
    minThreshold 第一个小的阈值
    maxThreshold 第二个大的阈值 minThreshold,maxThreshold较小时能检测更多的结果
    apertureSize Sobel算子的孔径大小
    L2gradient 计算梯形副度的标识,默认为False,使用L1范数计算,为True时使用更精确的L2范数计算


图像金字塔

  1. 高斯金字塔 向下采样
    dst = cv2.pyrDown(src[,dstsize[,borderType]])
    dstsize 目标图像大小,默认情况下输出大小为Size((src.cols+1)/2,(src.rows+1)/2)
    borderType 办界类型,仅支持BORDER_DEFAULT

  2. 高斯金字塔 向上采样
    dst = cv2.pyrUp(src[,dstsize[,borderType]])
    dstsize 目标图像大小,默认情况下输出大小为Size(src.cols2,src.rows2)
    borderType 办界类型,仅支持BORDER_DEFAULT
    两个方向操作不可逆

  3. 拉普拉斯金字塔 可获得采样过程中丢失的信息
    Li = Gi – pyrUp(Gi+1)
    Li 拉普拉斯金字塔的第i层
    Gi 高斯金字塔的第i层


图像轮廓

  1. 查找图像轮廓
    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 建立等级树的层次结构

  2. 绘制图像轮廓
    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 偏移参数,将轮廓偏移到不同的位置展示出来

  3. 轮廓矩特征 用来比较两个轮廓是否相似
    retval = cv2.moments(array[,binaryImage])
    array 可以是点集,灰度图,二值图
    binaryImage 为True时,array所有非零值都被处理为1,此值仅在array为图像时有效
    retval 特征矩 空间矩:零阶矩m00表示轮廓的面积 中心矩: 归一化中心矩:

  4. 计算轮廓的面积
    retval = cv2.contourArea(contour[,oriented])
    contour 轮廓
    oriented 默认False,返回绝对值 为True是返回值包含正负号,表示轮廓是顺时针还是逆时针的

  5. 计算轮廓的长度
    retval = cv2.arcLength(contour,closed)
    contour 轮廓
    closed True/False 轮廓是否封闭

  6. Hu矩–用来识别图像的特征
    hu = cv2.HuMoments(m);
    hu h0~h6
    m cv2.moments计算得到的矩特征值

  7. 形状匹配
    retval = cv2.matchShapes(contour1,contour2,method,parameter)
    contour1 contour2 两个轮廓或者灰度图像
    method 比较方法 cv2.CONTOURS_MATCH_I1(2/3)
    parameter 扩展参数到CV4.1.0暂都不支持,应设为0

  8. 轮廓拟合-矩形包围框
    retval = cv2.boundingRect(array)
    x,y,w,h = cv2.boundingRect(array)
    retval x,y,w,h 矩形边界左上角顶点坐标值及边界的宽度和高度
    array 灰度图像或轮廓

  9. 轮廓拟合-最小包围矩形框
    retval = cv2.minAreaRect(points)
    retval (最小外接矩形的中心(x,y),(宽度,高度),旋转角度)
    points 轮廓
    retval返回值不符合cv2.drawContours参数结构,需使用cv2.boxPoints()转换

  10. 转换轮廓 获取最小包围矩形框的四个顶点坐标
    points = cv2.boxPoints(box)
    points 能使用cv2.drawContours绘制的轮廓点
    box cv2.minAreaRect的返回值

  11. 轮廓拟合-最小包围圆形
    center, radius = cv2.minEnclosingCircle(points)
    (x,y), radius = cv2.minEnclosingCircle(points)
    center 最小包围圆形的中心
    radius 半径
    points 轮廓

  12. 轮廓拟合-最优拟合椭圆
    retval = cv2.fitEllipse(points)
    retval 是RotatedRect类型,包括质心,宽,高,旋转角度等信息
    points 轮廓

  13. 轮廓拟合-最优拟合直线
    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

  14. 轮廓拟合-最小外包三角形
    retval,triangle = cv2.minEnclosingTriangle(points)
    retval 最小外包三角形的面积
    triangle 最小外包三角形的三个顶点

  15. 轮廓拟合-逼近多边形-采用的是DP算法
    approxCurve = cv2.approxPolyDP(curve,epsilon,closed)
    approxCurve 逼近多边形的点集
    curve 轮廓
    epsilon 精度 原始轮廓的边界点与逼近多边形边界之间的最大距离,通常设为多边形总长度的百分比形式
    closed True/False 多边形是否封闭的

  16. 凸包
    hull = cv2.convexHull(points[,clockwise[,returnPoints]])
    points 轮廓
    clockwise True/False 凸包角点按顺时针或逆时针方向排列
    returnPoints True/False 默认为True,返回凸包角点的x/y坐标,反之返回角点的索引

  17. 绘制凸包
    cv2.polylines(image,[hull],True,(0,255,0),2)

  18. 凸缺陷-凸包与轮廓之间的部分
    convexityDefects = cv2.convexityDefects(contour,convexhull)
    convexityDefects 凸缺陷点集,一个数组[起点,终点,轮廓上距离凸包最远的点,最远的点到凸包的近似距离],前三个值为索引,需要到轮廓点中查找
    contour 轮廓
    convexhull 凸包 returnPoints的值必须是False

  19. 检测轮廓是否是凸形
    retval = cv2.isContourConvex(contour)
    retval True/False 是否凸形
    contour 要判断的轮廓

  20. 点到轮廓的距离,或点和多边形的关系测试
    retval = cv2.pointPolygonTest(contour,pt,measureDist)
    contour 轮廓
    pt 待判定的点
    measureDist 判定的方式:True计算点到轮廓的距离,点在轮廓的外部返回负值,在轮廓上返回0,在内部,返回正数, False只返回-1,0,1中的一个值

  21. 计算形状场景距离-构造距离提取算子
    retval = cv2.createShapeContextDistanceExtractor([,nAngularBins[,nRadialBins[,innerRadius[,outerRadus[,iterations[,comparer[,transformer]]]]]]])
    nAngularBins 角容器的数量
    nRadialBins 径向容器的数量
    innerRadius 内半径’
    outerRadus 外半径
    iterations 迭代次数
    comparer 直方图代价提取算子
    transformer 形状变换参数

  22. 计算不同形状场景距离
    retval = cv2.createShapeContextDistanceExtractor.computeDistance(contour1,contour2)
    contour1,contour2 是不同的轮廓

  23. 计算Hausdorff距离-构造距离提取算子
    retval = cv2.createHausdorffDistanceExtractor([,distanceFlag[,rankProp]])
    distanceFlag 距离标记
    rankProp 比例值0~1之间

  24. 轮廓的特征值
    宽高比 = 宽度/高度
    Extend = 轮廓面积(对象面积)/矩形边界面积
    Solidity = 轮廓面积(对象面积)/凸包面积
    Equivalent Diameter等效直径 = Sqrt(4*轮廓面积/PI)
    方向 = (x,y),(MA,ma),angle = cv2.fitEllipse(cnt) 利用椭圆方向

  25. 获取掩模
    参见cv2.drawContours绘制轮廓将参数thickness设为-1

  26. 使用Numpy函数获取轮廓像素点
    使用numpy.nonzero()找出数组内非0元素的位置,返回值是将行列分别显示
    再使用numpy.transpose()处理上述结果,得到这些点的(x,y)坐标

  27. 使用OpenCV函数获取轮廓点
    idx = cv2.findNonZero(src)
    idx 非0元素的索引位置,每个元素对应的是(列号,行号)格式
    src 要查找的非零元素的图像

  28. 最大值最小值及其位置
    min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(imgray,mask=mask)
    min_val,max_val 最小值,最大值
    min_loc,max_loc 最小值,最大值的位置
    imgray 单通道图像,灰度图像
    mask 掩模

  29. 平均颜色及平均灰度
    mean_val = cv2.mean(im,mask = mask) 能够计算各个通道的均值
    im 原图像
    mask 掩模

  30. 极点
    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]) 最下端点


直方图处理

  1. 绘制直方图-matplotlib.pyplot.hist()
    matplotlib.pyplot.hist(x,BINS)
    x 数据源
    BINS BINS值,灰度级的分组情况

  2. 二维数组降为一维数组
    b = a.ravel()

  3. 绘制直方图-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时直方图开始计算时不清零,用于一组图像计算,实时更新直方图,从多个对象中计算单个直方图,一般不用设置

  4. matplotlib.pyplot.plot 直方图绘图
    plt.plot(x,y,color=’r’) 省略x轴时默认生成与y长度一致的自然序数

  5. 直方图均衡化,综合考虑了统计概率和HVS的均衡化
    dst = cv2.equalizeHist(src)
    src 8位单通道原始图像

  6. matplotlib.pyplot.subplot 向当前窗口添加一个子窗口对象
    matplotlib.pyplot.subplot(nrows,ncols,index)

  7. matplotlib.pyplot.imshow 显示窗口,注意openCV的通道顺序BGR
    matplotlib.pyplot.imshow(X, cmap=None)
    X 图像信息
    cmap 色彩空间 默认null RGB(A)色彩空间

  8. matplotlib.pyplot.figure 构建窗口
    matplotlib.pyplot.figure(‘text’)

  9. matplotlib.pyplot.axis 关闭/显示坐标轴
    matplotlib.pyplot.axis(‘off’)


傳里叶变换

  1. numpy实现傳里叶变换
    retval = numpy.fft.fft2(原始灰度图像)
    retval 复数数组的频谱信息

  2. 零频率成分移动到频域图像中心位置
    retval = numpy.fft.fftshift(原始频谱)

  3. 频谱信息转换到[0,255]的灰度空间图
    像素新值 = 20*np.log(np.abs(频谱信息值))

  4. 零频率成分移动到频域图像中心位置的反向操作,移回原位
    retval = numpy.fft.ifftshift(原始频谱)

  5. numpy实现逆傳里叶变换
    retval = numpy.fft.ifft2(频域数据)
    retval 复数数组的空域信息

  6. 空域信息转换到[0,255]的灰度空间图
    像素新值 = np.abs(空域信息)

  7. 高通滤波,增加图中尖锐细节,保留边缘信息,低通滤波使图像变模糊
    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)

  8. opencv实现傳里叶变换
    rstval = cv2.dft(原始图像,转换标识)
    rstval 返回结果与nupmy转换一致,但是双通道,1通道为实数部分,2通道为虚数部分,再使用numpy.fft.fftshift(rstval)移到中心位置,再计算频谱信息的幅度,然后再20*np.log(),得到频谱信息
    原始图像 要先使用np.float32()转换格式
    转换标识 通常为cv2.DFT_COMPLEX_OUTPUT输出一个复数阵列

  9. 计算频谱信息的幅度
    rstval = cv2.magnitude(实部,虚部)

  10. 将幅度值映射为灰度空间[0,255]
    20*np.log(rstval)

  11. opencv实现逆傳里叶变换
    rstval = cv2.dft(频域数据)
    频域数据 如果先前移动了零频率分量,在使用前要先ifftshift移回原位置

  12. 低通滤波
    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])


模版匹配

  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

  2. 查找最值(极值)与所在的位置
    minVal,maxVal,minLoc,maxLoc = cv2.minMaxLoc(src[,mask])
    minVal,maxVal,minLoc,maxLoc 极值与位置,可以为NULL
    src 单通道数据
    mask 掩模的子集

  3. *取模版图像的宽高时语句
    th,tw = template.shape[::]
    tw,th = template.shape[::-1]

  4. 多模版匹配
    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)


霍夫变换

  1. 霍夫直线变换
    lines = cv2.HoughLines(image,rho,theta,threshold)
    lines 中每个元素都是一对浮点数,表示检测到的直线参数即(r,0)
    image 源图像8位单通道的二值图像
    rho 以像素为单位的距离r的精度,一般为1
    theta 角度0的精度,一般pi/180,表示搜索所有可能的角度
    threshold 阀值,越小判定出的直线越多

  2. 概率霍夫直线变换
    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 接受共线线段之间的最小间隔,即一条线段两点的最大间隔

  3. 霍夫圆环变换,在使用前先进行平滑操作,减少噪声,避免误判
    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()
形态学函数用于简单的图像

  1. 距离变换函数 获得前景图像的中心,得到确定前景,还能细化轮廓等多种功能
    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) 可用图像进行形态学膨胀操作得到

  1. 前景图像标注 背景标注为0,其它对像从1开始正数标注
    retval, labels = cv2.connectedComponents(image)
    retval 返回标注的数量
    labels 标注的结果图像
    image 为8位单通道待标注图像
    为适应分水岭算法,标注的结果都加上数值1,未知区域标注0
    ret, markers = cv2.connectedComponents(fore)
    markers = markers + 1
    markers[未知区域] = 0

  2. 分水岭算法图像分隔
    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]
  1. 交互式前景提取
    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固定模式

视频处理

  1. 摄像头初始化
    cap = cv2.VideoCapture(摄像头ID或文件名)

  2. 判断摄像头是否初始化成功
    retval = cv2.VideoCapture.isOpened()
    retval True成功 False失败

  3. 初始化失败后打开摄像头
    retval = cv2.VideoCapture.open(摄像头ID或文件名)

  4. 捕获帧
    retval, img = cap.read()
    img 捕获到的帧,没有为空
    retval True成功 False失败

  5. 关闭摄像头
    None= cv2.VideoCapture.cap.release()

  6. 摄像头属性获取
    retval = cv2.VideoCapture.cap.get(propid)
    propid 对象属性 cv2.CAP_PROP_FRAME_WIDTH 宽3 cv2.CAP_PROP_FRAME_HEIGHT 高4 FYI P385

  7. 摄像头属性设置
    retval = cv2.VideoCapture.cap.get(propid, value)

  8. 捕获多个摄像头数据
    retval = cv2.VideoCapture.grab() 指向下一帧
    retval True False 是否成功指向下一帧
    下一步
    retval, image = cv2.VideoCapture.retrieve() 解码并返回一帧
    retval True False 是否成功
    image 返回的视频帧,失败为空图像

  9. VideoWriter 保存视频文件,修改视频属性,类型转换等
    = cv2.VideoWriter(filename,fourcc, fps, frameSize[,isColor])
    filename 输出目标视频的文件路径和文件名
    fourcc 视频编码/解码类型 -1为弹窗口选择
    fps 帧速率
    frameSize 每帧的长和宽
    isColor 是否彩色图像

  10. 写入下一帧视频
    None = cv2.VideoWriter(image)

  11. 释放
    None = cv2.VideoWriter.release()
    out.release()

  12. 指定视频编/解码格式
    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 数据精度,一般不用设置

  1. 绘制线条
    img = cv2.line(img,pt1,pt2,color,thickness[,lineType])

  2. 绘制矩形
    img = cv2.rectangle(img,pt1,pt2,color[,thickness[,lineType]])

  3. 绘制圆形
    img = cv2.circle(img,center,radius,color[,thickness[,lineType]])
    center 圆心
    radius 半径

  4. 绘制椭圆
    img = cv2.ellipse(img,center,axes,angle,startAngle,endAngle,color[,thickness[,lineType]])
    center 圆心
    axes 轴的长度
    angle 偏转的角度
    startAngle 圆弧起始角的角度
    endAngle 圆弧终结角的角度

  5. 绘制多边形
    img = cv2.polylines(img,pts,isClosed,color[,thickness[,lineType[,shift]]])
    pts 多边形的各个顶点 数组类型为numpy.int32
    isClosed 闭合标记

  6. 图形上绘制文字
    img = cv2.putText(img,text,org,fontFace,fontScale,color[,thickness[,lineType[,bottomLeftOrigin]]])
    text 绘制的文字
    org 绘制的文字位置,以文字的左下角为起点
    fontFace 字体类型,cv2.FONT_HESRESHEY_SIMPLEX …
    fontScale 字体大小
    bottomLeftOrigin 控制文字的方向 默认False,True时垂直镜像的效果

  7. 鼠标交互
    定义响应函数
    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’)

  1. 滚动条 Trackbar
    cv2.createTrackbar(trackbarname,winname,vlaue,count,onChange)
    trackbarname 滚动条名称
    winname 绑定的窗口名
    vlaue 初始值,决定滚动条中滑块的位置
    count 滚动条取大值,通常最小值为0
    onChange 回调函数

  2. 获取滚动条的值
    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 使用用户输入的数据作为第一次分类的中心点,需要多次偿试时后续使用随机或半随机值作为第一次分类中心点


人脸识别

  1. 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 目标的最大尺寸,大于会补忽略

  1. 人脸识别: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 人脸图像所对应的标签

  1. 检测识别
    label, confidence = cv2.face_EigenFaceRecognizer.predict(src)
    label 返回的识别结果标签
    confidence 返回的置信度评分,0完全匹配,小于5000可以认为是可靠的,最大值20000
    src 需要识别的图像

人脸数据库

  1. CAS-PEAL
    1040位99594幅人脸图像,开放了子集 CAS-PEAL_R1 1040人的30900幅图像

  2. AT&T Facedatabase
    即以前的ORL,40个人400幅

  3. Yale Facedatabase A
    耶鲁人脸数据库,15*11

  4. Extend Yale Facedatabase B
    扩展耶鲁人脸数据库B 28964 16128张

  5. color FERET Database
    1564组,共14126张,由1199个不同拍摄对像重复拍摄,最广泛之一

  6. 人脸数据库整理网站
    opencv推荐 http://face-rec.org/database