Opencv-python学习笔记
2015-09-07 14:47
288 查看
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中
在完成后,在利用双线性插值拼接图片
直方图的反向投影
#相关文章推荐
- pip 安装 MySQL-python 失败
- [LeetCode]题解(python):001-Two-Sum
- python爬虫糗事百科
- python 实现文件打开读取内容然后写入更新内容(文件只打开一次)
- Python中文分词组件 jieba
- 通过web远程访问服务器的ipython
- Python 提取两个列表的交集
- Python 的列表排序
- Python File writelines() Method 按行写文件
- python__模块
- python 同步两个文件夹下的内容(包括子文件夹)
- 2小时玩转python基础(下)
- machine learning in coding(python):polynomial curve fitting,python拟合多项式
- python导入模块的方法
- python交互环境tab补齐
- python 学习之glob、dir、getattr、callable、正则表达式
- Python 输入输出
- python metaclass
- python 读取mat文件
- python杀死一个线程的方法