opencv-机器学习

来源:互联网 发布:淘宝没有盗版书了 编辑:程序博客网 时间:2024/05/29 17:12

参考:

1、http://docs.opencv.org/3.3.0/  官方文档api

2、http://docs.opencv.org/3.3.0/d6/d00/tutorial_py_root.html 官方英文教程

3、https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html

4、https://github.com/makelove/OpenCV-Python-Tutorial# 进阶教程

5、https://docs.opencv.org/3.3.0/index.html  官方英文教程

6、https://github.com/abidrahmank/OpenCV2-Python-Tutorials

7、https://www.learnopencv.com/

8、http://answers.opencv.org/questions/ OpenCV论坛

9、https://github.com/opencv/opencv   官方github

10、https://github.com/abidrahmank/OpenCV2-Python-Tutorials


注:安装的版本 opencv_python-3.3.0-cp36-cp36m-win_amd64.whl



参考:https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html




K-Nearest Neighbour

Understanding k-Nearest Neighbour

kNN in OpenCV

我们将在这里做一个简单的例子,有两个家庭(类),就像上面一样。 然后在下一章中,我们将做更多更好的例子。


所以在这里,我们将Red系列标记为Class-0(由0表示)和Blue系列作为Class 1(由1表示)。 我们创建25个类别或25个训练数据,并将其标记为class-0或class-1。 我们在Numpy的随机数生成器的帮助下完成所有这些。


然后我们在Matplotlib的帮助下绘制它。 红色类别显示为红色三角形,蓝色类别显示为蓝色正方形。


import cv2import numpy as npimport matplotlib.pyplot as plt# Feature set containing (x,y) values of 25 known/training datatrainData = np.random.randint(0,100,(25,2)).astype(np.float32)# Labels each one either Red or Blue with numbers 0 and 1responses = np.random.randint(0,2,(25,1)).astype(np.float32)# Take Red families and plot themred = trainData[responses.ravel()==0]plt.scatter(red[:,0],red[:,1],80,'r','^')# Take Blue families and plot themblue = trainData[responses.ravel()==1]plt.scatter(blue[:,0],blue[:,1],80,'b','s')plt.show()


import cv2import numpy as npimport matplotlib.pyplot as pltnewcomer = np.random.randint(0,100,(1,2)).astype(np.float32)plt.scatter(newcomer[:,0],newcomer[:,1],80,'g','o')knn = cv2.KNearest()knn.train(trainData,responses)ret, results, neighbours ,dist = knn.find_nearest(newcomer, 3)print ("result: ", results,"\n")print ("neighbours: ", neighbours,"\n")print ("distance: ", dist)plt.show()


使用kNN的手写数据的OCR

手写数字的OCR

import numpy as npimport cv2from matplotlib import pyplot as pltimg = cv2.imread('digits.png')gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# Now we split the image to 5000 cells, each 20x20 sizecells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]# Make it into a Numpy array. It size will be (50,100,20,20)x = np.array(cells)# Now we prepare train_data and test_data.train = x[:,:50].reshape(-1,400).astype(np.float32) # Size = (2500,400)test = x[:,50:100].reshape(-1,400).astype(np.float32) # Size = (2500,400)# Create labels for train and test datak = np.arange(10)train_labels = np.repeat(k,250)[:,np.newaxis]test_labels = train_labels.copy()# Initiate kNN, train the data, then test it with test data for k=1knn = cv2.KNearest()knn.train(train,train_labels)ret,result,neighbours,dist = knn.find_nearest(test,k=5)# Now we check the accuracy of classification# For that, compare the result with test_labels and check which are wrongmatches = result==test_labelscorrect = np.count_nonzero(matches)accuracy = correct*100.0/result.sizeprint accuracy

# save the datanp.savez('knn_data.npz',train=train, train_labels=train_labels)# Now load the datawith np.load('knn_data.npz') as data:    print data.files    train = data['train']    train_labels = data['train_labels']

英文字母OCR

import cv2import numpy as npimport matplotlib.pyplot as plt# Load the data, converters convert the letter to a numberdata= np.loadtxt('letter-recognition.data', dtype= 'float32', delimiter = ',',                    converters= {0: lambda ch: ord(ch)-ord('A')})# split the data to two, 10000 each for train and testtrain, test = np.vsplit(data,2)# split trainData and testData to features and responsesresponses, trainData = np.hsplit(train,[1])labels, testData = np.hsplit(test,[1])# Initiate the kNN, classify, measure accuracy.knn = cv2.KNearest()knn.train(trainData, responses)ret, result, neighbours, dist = knn.find_nearest(testData, k=5)correct = np.count_nonzero(result == labels)accuracy = correct*100.0/10000print accuracy



Support Vector Machines (SVM)

使用SVM的手写数据的OCR

手写数字的OCR

这里,在找到HOG之前,我们会用其二阶时间去掉图像。 因此,我们首先定义一个可以使用数字图像并进行deskew()的函数。 以下是deskew()函数:

def deskew(img):    m = cv2.moments(img)    if abs(m['mu02']) < 1e-2:        return img.copy()    skew = m['mu11']/m['mu02']    M = np.float32([[1, skew, -0.5*SZ*skew], [0, 1, 0]])    img = cv2.warpAffine(img,M,(SZ, SZ),flags=affine_flags)    return img


def hog(img):    gx = cv2.Sobel(img, cv2.CV_32F, 1, 0)    gy = cv2.Sobel(img, cv2.CV_32F, 0, 1)    mag, ang = cv2.cartToPolar(gx, gy)    # quantizing binvalues in (0...16)    bins = np.int32(bin_n*ang/(2*np.pi))    # Divide to 4 sub-squares    bin_cells = bins[:10,:10], bins[10:,:10], bins[:10,10:], bins[10:,10:]    mag_cells = mag[:10,:10], mag[10:,:10], mag[:10,10:], mag[10:,10:]    hists = [np.bincount(b.ravel(), m.ravel(), bin_n) for b, m in zip(bin_cells, mag_cells)]    hist = np.hstack(hists)    return hist


最后,像以前的情况一样,我们首先将我们的大数据集分成单独的单元格。 对于每个数字,250个单元被保留用于训练数据,剩余的250个数据被保留用于测试。 完整代码如下:

import cv2import numpy as npSZ=20bin_n = 16 # Number of binssvm_params = dict( kernel_type = cv2.SVM_LINEAR,                    svm_type = cv2.SVM_C_SVC,                    C=2.67, gamma=5.383 )affine_flags = cv2.WARP_INVERSE_MAP|cv2.INTER_LINEARdef deskew(img):    m = cv2.moments(img)    if abs(m['mu02']) < 1e-2:        return img.copy()    skew = m['mu11']/m['mu02']    M = np.float32([[1, skew, -0.5*SZ*skew], [0, 1, 0]])    img = cv2.warpAffine(img,M,(SZ, SZ),flags=affine_flags)    return imgdef hog(img):    gx = cv2.Sobel(img, cv2.CV_32F, 1, 0)    gy = cv2.Sobel(img, cv2.CV_32F, 0, 1)    mag, ang = cv2.cartToPolar(gx, gy)    bins = np.int32(bin_n*ang/(2*np.pi))    # quantizing binvalues in (0...16)    bin_cells = bins[:10,:10], bins[10:,:10], bins[:10,10:], bins[10:,10:]    mag_cells = mag[:10,:10], mag[10:,:10], mag[:10,10:], mag[10:,10:]    hists = [np.bincount(b.ravel(), m.ravel(), bin_n) for b, m in zip(bin_cells, mag_cells)]    hist = np.hstack(hists)     # hist is a 64 bit vector    return histimg = cv2.imread('digits.png',0)cells = [np.hsplit(row,100) for row in np.vsplit(img,50)]# First half is trainData, remaining is testDatatrain_cells = [ i[:50] for i in cells ]test_cells = [ i[50:] for i in cells]######     Now training      ########################deskewed = [map(deskew,row) for row in train_cells]hogdata = [map(hog,row) for row in deskewed]trainData = np.float32(hogdata).reshape(-1,64)responses = np.float32(np.repeat(np.arange(10),250)[:,np.newaxis])svm = cv2.SVM()svm.train(trainData,responses, params=svm_params)svm.save('svm_data.dat')######     Now testing      ########################deskewed = [map(deskew,row) for row in test_cells]hogdata = [map(hog,row) for row in deskewed]testData = np.float32(hogdata).reshape(-1,bin_n*4)result = svm.predict_all(testData)#######   Check Accuracy   ########################mask = result==responsescorrect = np.count_nonzero(mask)print correct*100.0/result.size




K均值聚类

K-Means Clustering in OpenCV

1. 只有一个特征的数据

import numpy as npimport cv2from matplotlib import pyplot as pltx = np.random.randint(25,100,25)y = np.random.randint(175,255,25)z = np.hstack((x,y))z = z.reshape((50,1))z = np.float32(z)plt.hist(z,256,[0,256]),plt.show()


# Define criteria = ( type, max_iter = 10 , epsilon = 1.0 )criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)# Set flags (Just to avoid line break in the code)flags = cv2.KMEANS_RANDOM_CENTERS# Apply KMeanscompactness,labels,centers = cv2.kmeans(z,2,None,criteria,10,flags)A = z[labels==0]B = z[labels==1]# Now plot 'A' in red, 'B' in blue, 'centers' in yellowplt.hist(A,256,[0,256],color = 'r')plt.hist(B,256,[0,256],color = 'b')plt.hist(centers,32,[0,256],color = 'y')plt.show()


2. 多个特征的数据

import numpy as npimport cv2from matplotlib import pyplot as pltX = np.random.randint(25,50,(25,2))Y = np.random.randint(60,85,(25,2))Z = np.vstack((X,Y))# convert to np.float32Z = np.float32(Z)# define criteria and apply kmeans()criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)ret,label,center=cv2.kmeans(Z,2,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)# Now separate the data, Note the flatten()A = Z[label.ravel()==0]B = Z[label.ravel()==1]# Plot the dataplt.scatter(A[:,0],A[:,1])plt.scatter(B[:,0],B[:,1],c = 'r')plt.scatter(center[:,0],center[:,1],s = 80,c = 'y', marker = 's')plt.xlabel('Height'),plt.ylabel('Weight')plt.show()

Result of KMeans Clustering



3. 颜色量化

import numpy as npimport cv2img = cv2.imread('home.jpg')Z = img.reshape((-1,3))# convert to np.float32Z = np.float32(Z)# define criteria, number of clusters(K) and apply kmeans()criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)K = 8ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)# Now convert back into uint8, and make original imagecenter = np.uint8(center)res = center[label.flatten()]res2 = res.reshape((img.shape))cv2.imshow('res2',res2)cv2.waitKey(0)cv2.destroyAllWindows()
Color Quantization



原创粉丝点击