其他圖像識別鏈接:https://www.cnblogs.com/sjzh/p/6104105.html
圖像歸一化和二值化處理鏈接:https://blog.csdn.net/m0_38052500/article/details/107305000
一、圖像基礎知識
1) 圖像(如rpg格式)由像素點組成
400*300意思是行400像素點,列300像素點
2)每個像素點 => RGB(a,b,c) 其中a b c介於 [0,255]
3)灰色的像素點 a=b=c ,靠近白色則近255,靠近黑色則近0
即:黑白灰圖片的像素點必然 a=b=c
總結:一個圖像的shape:(行像素,列像素,3)
二、圖像識別流程分析
4-0 opencv: 計算機視覺lib
4-1 讀取圖片 import cv2
digit = cv2.imread("D:/PyProjects/data/KNN/mnist_data/0.0.jpg") plt.imshow(digit) plt.show()
結果:
4-2 提取特征
由於處理的是黑白灰圖,a=b=c,提取圖像的特征只需要2軸中的一個數字,於是
先求出原圖的shape => (28,28,3)
digit[:,:,0] 降維成2維, .reshape(784,) 變成1維,28*28=784
結果:獲得一維特征
4-3 特征優化—— 二值化處理:黑白灰變成黑白,防止灰色混雜在黑色里
1)手寫字體情況:我們並不需要知曉黑色的深淺,只需要知道黑色的部分是否不是黑色。因為不是白色的位置,就意味着是字體的一部分。
>>> 直接 if x!= 255 賦值 1 else 0 # 只要不是白色,就一定是黑色
2)其他:
Q1: 待解決的問題:如何界定判定黑 白的標准?
# 灰 -> 黑 or 白 for rn in range(len(res)): res[rn] = 0 if res[rn] < 100 else 255 train.append(res)
4-4 循環讀入圖片,num是label,flag是對應num的圖片
# 訓練目標數組和訓練集數組 train,target = [],[] # 利用循環讀入0-9的每個3000張圖片 for num in range(10): for flag in range(3000): target.append(num) # array-like of shape (n_samples,) or (n_samples, n_outputs) digit = cv2.imread("D:/PyProjects/data/KNN/mnist_data/"+str(num)+"."+str(flag)+".jpg") res = digit[:,:,0].reshape(784) # 灰色R=P=G # 灰 -> 黑 or 白 for rn in range(len(res)): res[rn] = 0 if res[rn] < 100 else 255 train.append(res)
4-5 求最佳近鄰值
krange = range(1,55) knnscore = [] for k in krange: knn = KNeighborsClassifier() val = cross_val_score(knn,train,target,cv=20,scoring='accuracy') # 為什么20? => 一定有0-9 knnscore.append(val.mean()) plt.plot(krange,knnscore,'r') plt.show()
結果:
問題:為什么cv=20?
4-6 建立KNN模型算法
knn = KNeighborsClassifier(n_neighbors=6,weights='distance',p=2,n_jobs=-1) # p=2 歐式距離;n_jobs=-1 所有線程都工作; knn.fit(train,target) # KNN模型已生成
參數含義見
https://blog.csdn.net/weixin_41990278/article/details/93169529
4-7 測試模型識別結果是否准確
# 圖像識別測試 # 數據准備 test,test_target = [],[] for rn in range(10): for co in range(300,310): # 使用每個label的第300-309個圖片測試 test_target.append(rn) digit1 = cv2.imread("D:/PyProjects/data/KNN/mnist_data/" + str(rn) + "." + str(co) + ".jpg") res1 = digit1[:, :, 0].reshape(784) # 灰色R=P=G for rn in range(len(res1)): res1[rn] = 0 if res1[rn] < 100 else 255 test.append(res1) # 數據預測 pred_res = knn.predict(test) print("====識別結果===") print(pred_res) print("====真實結果===") print(test_target)