Python中opencv的使用

1 Python的opencv安装

OpenCV-Python Tutorials:
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials.html

python 安装目录:C:\Users\w00250712\AppData\Local\Programs\Python

2 图像基本操作 

获取图像的属性:
shape:返回行数,列数,通道数目
size:返回像素点个数
dtype:返回图像的数据类型

图像的单个像素点:img[x,y]
某个区域:img[x1:x2,y1:y2]
拆分通道:
B,g,r=cv2.split(img)
Img=cv2.merge(b,g,r)
或者:
B=img(:,:,0)
G=img(:,:,1)
Img(:,:,0)=0
图像空间转换:
cv2.cvtColor(input_image,flag),其中flag就是转换类型。
对于BGR--->Gray 的转换, 我们用的cv2.COLOR_BGR2GRAY。
同样对于BGR---->HSV 的转换,我们用的flag 就是cv2.COLOR_BGR2HSV。
图像的缩放:
cv2.resize(): 缩放因子有cv2.INTER_AREA(默认),v2.INTER_CUBIC(慢)
img=cv2.imread('messi5.jpg')
# 下面的None 本应该是输出图像的尺寸,但是因为后边我们设置了缩放因子
# 因此这里为None
res=cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
#OR
# 这里呢,我们直接设置输出图像的尺寸,所以不用设置缩放因子
height,width=img.shape[:2]
res=cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC)

3 图像的变换,二值化,滤波

OpenCV 提供了两个变换函数,cv2.warpAffine 和cv2.warpPerspective,
使用这两个函数你可以实现所有类型的变换。cv2.warpAffine 接收的参数是
2*3 的变换矩阵,而cv2.warpPerspective 接收的参数是3 * 3 的变换矩
这些获取旋转矩阵的方法:cv2.getRotationMatrix2D-----返回2*3矩阵
仿射变换的方法:cv2.getAffineTransform----返回2*3矩阵
透射变换:由函数cv2.getPerspectiveTransform() 构建,然后把这个矩阵传给函数
cv2.warpPerspective。

图像的二值化:
cv2.threshold,cv2.adaptiveThreshold

图像的滤波:
cv.filter2D()
#0 是指根据窗口大小(5,5)来计算高斯函数标准差
blur = cv2.GaussianBlur(img,(5,5),0)
#中值滤波
median = cv2.medianBlur(img,5)
#双边滤波
#9 邻域直径,两个75 分别是空间高斯函数标准差,灰度值相似性高斯函数标准差
blur = cv2.bilateralFilter(img,9,75,75)

4 图像的形态学操作

图像腐蚀:
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
图像膨胀:
dilation = cv2.dilate(img,kernel,iterations = 1)
图像开运算:先腐蚀后膨胀,通常用来去除噪声
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
图像闭运算:先膨胀后腐蚀,通常用来填充前景物体中的小洞
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
形态学梯度:可以获取物体轮廓
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

5 图像的梯度和边缘

#cv2.CV_64F 输出图像的深度(数据类型),可以使用-1, 与原图像保持一致np.uint8
laplacian=cv2.Laplacian(img,cv2.CV_64F)
# 参数1,0 为只在x 方向求一阶导数,最大可以求2 阶导数。
sobelx=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
# 参数0,1 为只在y 方向求一阶导数,最大可以求2 阶导数。
sobely=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
canny边缘检测:
在OpenCV 中只需要一个函数:cv2.Canny(),就可以完成以上几步。
让我们看如何使用这个函数。这个函数的第一个参数是输入图像。第二和第三
个分别是minVal 和maxVal。第三个参数设置用来计算图像梯度的Sobel
卷积核的大小,默认值为3。最后一个参数是L2gradient,它可以用来设定
求梯度大小的方程。

图像的轮廓:。。。。。

6 图像模板匹配

模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。OpenCV 为
我们提供了函数:cv2.matchTemplate()。和2D 卷积一样,它也是用模
板图像在输入图像(大图)上滑动,并在每一个位置对模板图像和与其对应的
输入图像的子区域进行比较。OpenCV 提供了几种不同的比较方法(细节请看
文档)。返回的结果是一个灰度图像,每一个像素值表示了此区域与模板的匹配
程度。
如果输入图像的大小是(WxH),模板的大小是(wxh),输出的结果
的大小就是(W-w+1,H-h+1)。当你得到这幅图之后,就可以使用函数
cv2.minMaxLoc() 来找到其中的最小值和最大值的位置了。第一个值为矩
形左上角的点(位置),(w,h)为moban 模板矩形的宽和高。这个矩形就是
找到的模板区域了。
用法如下:
# Apply template Matching
res = cv2.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
寻找最大值最小值的方法有:
# All the 6 methods for comparison in a list
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
其中TM_SQDIFF和TM_SQDIFF_NORMED取的是最小值,其他取的是最大值
# If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
如果是匹配到多个结果,那么就需要设置阈值:
loc = np.where( res >= threshold)

7 图像检测直线,圆

Hough变换:
img = cv2.imread('dave.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
lines = cv2.HoughLines(edges,1,np.pi/180,200)
Probabilistic Hough Transform:
img = cv2.imread('dave.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength = 100  #线的最短长度。比这个短的线都会被忽略。
maxLineGap = 10    #两条线段之间的最大间隔,如果小于此值,这两条直线就被看成是一条直线。
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
for x1,y1,x2,y2 in lines[0]:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

hough检测圆:
img = cv2.imread('opencv_logo.png',0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
param1=50,param2=30,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# draw the outer circle
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)

8 图像分割

分水岭算法:
markers3 = cv2.watershed(img,markers)
opencv自带交互式分水岭图像分割算法实例:
watershed.py

grabcut进行交互式图像前景提取:
grabcut.py

9 图像特征检测和提取

Harris焦点检测:
Open 中的函数cv2.cornerHarris() 可以用来进行角点检测。参数如
下:
img - 数据类型为float32 的输入图像。
blockSize - 角点检测中要考虑的领域大小。
ksize - Sobel 求导中使用的窗口大小
k - Harris 角点检测方程中的自由参数,取值参数为[0,04,0.06].
Shi-Tomasi角点检测:适用于跟踪的图像特征
OpenCV 提供了函数:cv2.goodFeaturesToTrack()。这个函数可以
帮我们使用Shi-Tomasi 方法获取图像中N 个最好的角点(如果你愿意的话,也可以通过改变参数来使用Harris 角点检测算法)。通常情况下,输入的应该
是灰度图像。然后确定你想要检测到的角点数目。再设置角点的质量水平,0
到1 之间。它代表了角点的最低质量,低于这个数的所有角点都会被忽略。最
后在设置两个角点之间的最短欧式距离。
根据这些信息,函数就能在图像上找到角点。所有低于质量水平的角点都
会被忽略。然后再把合格角点按角点质量进行降序排列。函数会采用角点质量
最高的那个角点(排序后的第一个),然后将它附近(最小距离之内)的角点都
删掉。按着这样的方式最后返回N 个最佳角点。
SIFT特征点:前面两种角点具备旋转不变性,但是不能抵抗图像缩放,SIFT可以。
SURF: 加速版的SIFT

10 视频分析:meanshift和camshift

Opencv提供一个camshift的交互演示

11 KNN算法

KNN:k-Nearest Neighbour分类算法
Opencv3.3中的KNN算法如下:
knn = cv2.ml.KNearest_create()
knn.train(trainData,cv2.ml.ROW_SAMPLE,responses)
ret, results, neighbours ,dist = knn.findNearest(newcomer, 3)
KNN算法可以用来对手写数字和手写的英文字母进行识别,准确率还是很高的。

12 支持向量机SVM

Opencv自带函数digits.py,里面有svm和knn算法进行手写数字识别

13 K值聚类

前面的KNN和SVM都是有监督的分类方法,而K值聚类是无监督的分类方法
函数是:cv2.kmeans

猜你喜欢

转载自blog.csdn.net/stevedish_xiaojia/article/details/83051015