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中
- 在完成后,在利用双线性插值拼接图片
直方图的反向投影
#