機器學習之 KNN近鄰算法(三)圖像識別


其他圖像識別鏈接: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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM