Opencv-python学习笔记

matplotlib

  • Matplotlib是python的一个绘图库,可以用来绘制各种的图像
  • Matplotlib和opencv图像的储存方式不一样,一个是RGB,一个是BGR
  • imshow,show,xticks,yticks

VideoCapture

  • opencv提供了简单的摄像头接口,Videocapture() 参数可以为设备标号(由于笔记一般自带摄像头,设备号为0)或者一个视频文件名
  • 用完后一定要调用release方法释放
  • read()返回一个布尔值和帧图像
  • isopen()可以得到是否成功打开摄像头,若不成功,可以用open()方法打开
  • get(propid)可以得到图像的相关属性,propid可以取[0,18]中的整数,分别代表不同的属性
  • set(propid,value)可以设置相关属性
  • 当摄像头不能工作时,先检查其他程序是否能打开摄像头

createTrackBar,getTrackBarPos

  • createtrackbar(TrackBar的名字,窗口的名字,最小值,最大值,回调函数)
  • getTrackBarPos(TrackBar的名字,所属窗口)返回一个整型

核心操作

  • opencv中可以利用numpy对矩阵的操作操作图像,尽量用矩阵操作来代替循环操作
  • opencv打开的图像是按BGR的顺序排列的,有点非主流
  • img[100,100,0]为取(100,100)这的点的蓝色分量
  • 读取某一点尽量用numpy内置的函数item和itemset:
img=numpy.zeros((100,100,3),numpy.uint8)
img.item(9,9,2)
img.itemset((9,9,2),255)
  • 图像的属性包括:行,列,通道,图像的数据类型,像素数目等,分别用shape(返回行列和通道数,如果是单通道,则只返回行和列),size(像素数目),dtype(数据类型)
  • 有时我们要对图像某一个通道进行操作,可以使用
b,g,r=cv2.split(img)这个操作比较费时间
img=cv2.merge(b,g,r)
或则
b=img[:.:.0]

copyMakeBorder()

  • copymakeborder(src,top,bottom,left,right,borderType)

图像的运算

  • 图像的加法可以使用opencv的add运算(不会溢出),或numpy的+(会溢出)
  • 图像的混合使用opencv的addweighted操作,公式如下:
    $$dst=a****img1+b*img2+c
  • 图像的位运算:bitwise_and等等,参数(img1,img2,mask)
  • dst[x,y]=img1[x,y]^img2[x,y] if mask[x,y]!=0

程序效率的测量

  • 使用ipython的%timeit函数可以直接测量某一个语句的xiaolv
  • 也可以使用opencv自带的gettickcount和gettickfrequency
  • opencv中已经进行了优化的,可以使用useOptimized()来查看

颜色空间的转换

  • opencv中有180多种不同的颜色转换方式,在python中,以COLOR_开头
  • 其中比较常用的是RGB2GRAY和RGB2HSV(h 颜色 s饱和度 v 亮度)
  • 不同软件的hsv取值不一样,在使用前一定要先初始化

物体跟踪初步

  • 跟踪视频中某以颜色的物体,最好在HSV空间中进行
  • 用bitwise_and运算取出图像

图像变换

  • 缩放变换 cv2.resize(img,(cols,rows))
  • 平移,旋转等都用变换矩阵,平移的是[[1,0,tx],[0,1,ty]],旋转用getRotationMatrix2D得到,之后用warpAffine(img,Matrix,(rows,cols))
  • 仿射变换 已知三个点在原图像和变换后的图像的位置,则可以利用getAffineTransform得到变化矩阵
  • 透射变换 视觉变换,要已知四个点才可以得到变换方程,getPerspectiveTransform得到变换矩阵

形态学转换

  • 形态学转换有七种:腐蚀,膨胀,开运算,闭运算,形态学梯度,礼帽,黑帽
  • 腐蚀erode:在窗中,全部为1的不变,含有0的为0,可以区白噪点
  • 膨胀dilate:在窗中,全部为0的不变,含有1的为1,可以增加前景中的白色部分
  • 开运算morphology-open:先腐蚀,后膨胀,去白噪点
  • 闭运算morphology-close:先膨胀,后腐蚀,去黑噪点
  • 形态学梯度morphology-grandient:可以得到轮廓
  • 礼帽tophat:开运算和原图像的差
  • 黑帽blackhat:闭运算和原图像的差

结构化元素

  • getStructuringElements(形状,大小)通过这个方法可以得到不同形状的核

图像的梯度

  • sobel(),可以求某一个方向的梯度
  • laplacian(),求二阶度

canny边缘检测

  • 分四步
    • 噪音去除:边缘检测很容易受到噪点的影响
    • 计算图像梯度:向量和
    • 分极大值抑制:去除边界点
    • 滞后阈值:maxVal和minVal,高于maxVal的点会被判定为边界点,低于maxVal但高于minVal的点,如果和判定为边界的点相连,则判定为边界点,否则为非边界点,低于minVal的为非边界点

图像金字塔

  • 图像金字塔分为两种:高斯金字塔和拉普拉斯金字塔,可以想象为倒立的金字塔
  • 高斯金字塔:将顶部的图像隔行隔列去除,得到cols/2和rows/2的新图像
  • pyrDown(),图像变小
  • pyrUp(),图像变大,但分辨率不变
  • 可以用于图像融合

统计直方图

  • 基本术语:BINS 分为多少组,简单来说就是横坐标
    DIMS 我们收集数据的参数数目,一般我们只统计灰度值,所以为1
    RANGE 统计数据的范围
  • 使用opencv统计直方图:
    • cv2.calcHist(images,channels,mask,histSize,ranges)
    • 其中除了mask,其他都为list
  • 使用numpy统计直方图:
    • np.histtogram(img,ravel(),histSize,range)
    • 注意,opencv比numpy的直方图统计快差不多40倍
  • 作图方法:
    • 简单方法,直接调用matplotlib.pyplot.hist()方法画图,如果是多通道的话,他会就个通道对应值求和
    • 和np.histogram用法一样

直方图均衡化

  • numpy中没有直接均衡化的函数,要手动均衡化,求积分图,在忽略0值的情况下归一化
  • cv2.equalizeHise(img)
  • np.hstack(img1,img2) 可以将两个图合并
  • 还有一种均衡化,自适应均衡化,根据局部情况进行自适应,对噪音敏感
  • 一般设置一个最大值,但hist的值大于这个值时,会平均分到其他bin中
  • 在完成后,在利用双线性插值拼接图片

直方图的反向投影

#

你可能感兴趣的:(opencv)