您的位置:首页 > 编程语言 > Python开发

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中

在完成后,在利用双线性插值拼接图片

直方图的反向投影

#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: