OpenCv中的 KNN 算法實現手寫數字的識別

目錄

一.案例:手寫數字的識別

1.安裝opencv-python庫

2.將大圖分割成100×50個小圖,每份對應一個手寫數字樣品

3.訓練集和測試集

4.為訓練集和測試集準備結果標簽

5.模型訓練與預測

6.計算準確率

7.完整代碼實現


一.案例:手寫數字的識別

現有一張2000×1000像素的手寫數字照片digits.png作為數據集,如下共有100列50行,由此我們可以計算出一個手寫數字的大小是20×20像素

1.安裝opencv-python庫

安裝opencv-python庫指令(可以根據自己的需要指定版本)如下:

pip install opencv-python==3.4.11.45 -i Https://pypi.tuna.tsinghua.edu.cn/simple

上面的digits.png圖片是彩色圖像,由RGB三個通道疊加而成,所以它的本質是三維矩陣

我們需要利用opencv-python這個庫的imread()方法來讀取圖片數據

然后用cv2.cvtColor(img,COLOR_BGR2GRAY)將其轉換為灰度圖,灰度圖僅保留亮度信息轉化為二維矩陣,無彩色通道數據更簡化

import numpy as np
import cv2
img = cv2.imread('digits.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

2.將大圖分割成100×50個小圖,每份對應一個手寫數字樣品

先利用numpy的vsplit()方法,將大圖在垂直方向上分割成50行

再利用hsplit()方法把分割后的每一行在水平方向上切成100列

這樣就得到了50×100個手寫數字列表

cells = [ np.hsplit(row,100) for row in np.vsplit(gray,50)]

再用numpy庫的array()方法將列表轉化成矩陣,提升處理效率

data = np.array(cells)

3.訓練集和測試集

為了訓練和測試的準確性我們將全部數據的前50列作為訓練集,后50列作為測試集

train=data[:,:50]
test=data[:,50:]

訓練的數據都是一行數據代表一個樣本,前面我們知道一個手寫數字大小是20×20像素,所以我們可以將矩陣reshape為(-1,400)的樣式,這樣一行就是一個手寫數字的400個特征,訓練集和測試集各有2500行

數據類型也得從?uint8(0-255整數)轉為?float32,以支持KNN算法中的距離計算(含小數)

train_new=train.reshape(-1,400).astype(np.float32)
test_new=test.reshape(-1,400).astype(np.float32)

4.為訓練集和測試集準備結果標簽

用numpy庫中的arange()方法,生成0到9的數字序列,由于測試集和訓練集中每個數字都各有250個即他們的特征數據都各有250行,所以我們再用repeat()方法將數字序列重復250次

k=np.arange(0,10)
labels=np.repeat(k,250)

再將標簽labels通過np.newaxis 轉為二維列向量(2500×1),與特征數據對齊

train_labels = labels[:,np.newaxis]
test_labels = labels[:,np.newaxis]

5.模型訓練與預測

優先使用OpenCV內置算法(如KNN)以減少依賴庫數量,提升運行效率

使用OpenCV庫的KNN算法:

通過?cv2.ml.KNearest_create()創建v模型,在通過train()方法傳入訓練數據(特征矩陣和標簽),train()方法中的參數?cv2.ml.ROW_SAMPLE?表示指定每行為一個樣本數據

knn = cv2.ml.KNearest_create()
knn.train(train_new,cv2.ml.ROW_SAMPLE,train_labels)

使用findNearest()方法完成對測試集的預測并指定K值

返回結果result中存放預測的結果

ret,result,neighbors,dist=knn.findNearest(test_new,k=3)

6.計算準確率

由于OpenCV庫的KNN算法中沒有計算準確率的方法所以我們需要自己計算

通過result==test_labels,預測結果與標簽相同則放回True反之返回False,最后返回一個只有True和False的序列

通過np.count_nonzero()方法來計算一共有多少個True

最后直接用True的個數除以總共的個數即為準確率

matches = result==test_labels
correct=np.count_nonzero(matches)
accuracy=correct*100.0/result.size
print("識別手寫數字的準確率為{}%".format(accuracy))

7.完整代碼實現

import numpy as np
import cv2
img = cv2.imread('digits.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cells = [ np.hsplit(row,100) for row in np.vsplit(gray,50)]
data = np.array(cells)train=data[:,:50]
test=data[:,50:]train_new=train.reshape(-1,400).astype(np.float32)
test_new=test.reshape(-1,400).astype(np.float32)k=np.arange(0,10)
labels=np.repeat(k,250)
train_labels = labels[:,np.newaxis]
test_labels = labels[:,np.newaxis]knn = cv2.ml.KNearest_create()
knn.train(train_new,cv2.ml.ROW_SAMPLE,train_labels)
ret,result,neighbors,dist=knn.findNearest(test_new,k=3)matches = result==test_labels
correct=np.count_nonzero(matches)
accuracy=correct*100.0/result.size
print("識別手寫數字的準確率為{}%".format(accuracy))

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93768.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93768.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93768.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TCP/IP 傳輸層詳解

TCP/IP 傳輸層詳解 傳輸層(Transport Layer)是 TCP/IP 模型的第四層(對應 OSI 模型的傳輸層),核心功能是實現 端到端(進程到進程)的可靠通信。主要協議包括: TCP(傳輸控制…

深度學習筆記:Overview

本文根據吳恩達老師的深度學習課程整理而來,在此表示感知。 文章目錄1.課程筆記2.編程作業1.課程筆記 1)深度學習筆記(1):神經網絡基礎 2)深度學習筆記(2):淺層神經網絡…

LLM之RAG理論(十八)| ChatGPT DeepResearch 深度研究功能全面技術分析報告

一、背景與行業環境1.1 DeepResearch 的誕生與戰略意義ChatGPT DeepResearch(深度研究)是 OpenAI 于 2025 年 2 月 3 日正式發布的全新 AI 智能體產品,是繼 o3-mini 模型發布后,OpenAI 在 AI 研究領域的又一重大突破。這一功能的推…

數據庫學習--------數據庫日志類型及其與事務特性的關系

在數據庫系統中,日志是保證數據可靠性和一致性的重要組成部分,尤其與事務的特性緊密相連。無論是事務的原子性、一致性,還是持久性,都離不開日志的支持。數據庫日志(Database Log)是數據庫系統記錄自身操作…

如何在 Ubuntu 24.04 或 22.04 LTS 上安裝 OpenShot 視頻編輯器

OpenShot 視頻編輯器是一款輕量級工具,不需要高性能硬件即可編輯視頻。它最初是一個愛好項目,后來成為一款擁有簡單干凈用戶界面的流行免費編輯工具。這款直觀的視頻編輯器可以剪輯影片,并添加額外的視頻和音頻素材。最終,您可以將作品導出為您選擇的格式。本教程將向您展示…

SpringMVC核心原理與實戰指南

什么是MVC? MVC英文是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計規范。 MVC是用一種業務邏輯、數據、界面顯示分離的方法,將業務邏輯聚集到一個部件里面&am…

【JavaEE】(7) 網絡原理 TCP/IP 協議

一、應用層 應用層是程序員最關心的一層,需要自定義數據傳輸的格式,即前(客戶端)后(服務器)端交互的接口,然后調用傳輸層的 socket api 來實現網絡通信。 自定義數據傳輸的協議,主要…

深入理解 Slab / Buddy 分配器與 MMU 映射機制

📖 推薦閱讀:《Yocto項目實戰教程:高效定制嵌入式Linux系統》 🎥 更多學習視頻請關注 B 站:嵌入式Jerry 深入理解 Slab / Buddy 分配器與 MMU 映射機制 在現代 Linux 內核中,物理內存的管理和虛擬地址的映射是系統性能…

Layui核心語法快速入門指南

Layui 基本語法學習指南 Layui 是一個經典的模塊化前端框架,以其輕量易用、組件豐富著稱。以下是 Layui 的核心語法結構和使用方法: 一、模塊加載機制(核心基礎) // 標準模塊加載語法 layui.use([module1, module2], function()…

基于百度 iframe 框架與語音解析服務的數字人交互系統實現

在智能化交互場景中,數字人作為人機交互的重要載體,其語音交互能力與指令響應效率直接影響用戶體驗。本文將詳細介紹如何基于百度提供的 iframe 框架與語音解析服務,實現數字人語音播報、文字展示及指令響應的完整業務流程,涵蓋從插件初始化到實時語音交互的全鏈路實現邏輯…

高防服務器租用的優勢有哪些?

高防服務器具有著強大的防護能力,可以幫助企業抵御各種網絡攻擊,其中包括大規模的DDOS攻擊,高防服務器中還有著防火墻、流量清洗和負載均衡等多種安全技術,能夠保證業務持續穩定的運行,降低了企業整體的損失和安全風險…

7.28 進制交換|迭代器模式|map|子集按位或|帶參遞歸

lc701.二叉搜索樹插入void dfs不行TreeNode* dfs,帶接受參數處理的dfs當為空的時候,就可以添加插入if (!root){return new TreeNode(val);}插入位置root->left insertIntoBST(root->left, val);class Solution {public:TreeNode* insertIntoBST(T…

方法學習(二)

.一、變量作為實參使用:1.定義一個方法,比較兩個整數的大小,如果第一個整數比第二個整數大,返回true否則返回false。public static void main(String[] args) {int i 3;int j 5;//傳遞的是i和j,但是真正傳遞的是i和j…

計算機視覺CS231n學習(1)

面向視覺識別的卷積神經網絡 CS231n Introduction計算機視覺的歷史 the history of computer vision 重要節點:1959 Hubel & Wiesel 利用和人比較相像的貓的視覺神經做實驗:簡單細胞反應燈的位置;復雜細胞反應燈的位置和移動;…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 微博內容IP地圖可視化分析實現

大家好,我是java1234_小鋒老師,最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程,持續更新中,計劃月底更新完,感謝支持。今天講解微博內容IP地圖可視化分析實現 視頻在線地…

Z20K118庫中寄存器及其庫函數封裝-SYSCTRL庫

1. 系統設備識別寄存器(SCM)7個位域。 記錄設備信息。Z20K11x[FAM_ID:Z20K/Z20M,SUBF_ID:1/3,SER_ID:1/4]特征ID版本號FLASH存儲器大小封裝類型。1-1 SYSCTRL_DeviceId_t SYSCTRL_GetDeviceId(void)讀取設備信息。2.獨一ID號寄存器(SCM)4個該寄存器存儲完…

007TG洞察:波場TRON上市觀察,Web3流量工具的技術解析與應用

引言:波場TRON(TRX)登陸資本市場及近期加密市場熱點(如MEME幣),凸顯了實時流量捕獲與轉化在Web3領域的戰略地位。對于技術團隊而言,構建支撐全球業務的Web3平臺,核心挑戰在于&#x…

STM32——HAL 庫MDK工程創建

總:STM32——學習總綱 參考工程: 實驗0-3,新建工程實驗-HAL庫版本 前置知識: STM32——HAL庫 一、HAL 庫 MDK工程新建步驟簡介 例: 各個文件夾內容: 1.1 Drivers 1.2 Middlewares 1.3 Output 1.4 Pro…

【圖像處理】霍夫變換:霍夫變換原理、霍夫空間、霍夫直線、霍夫圓詳解與代碼示例

霍夫變換詳解與代碼示例 霍夫變換(Hough Transform)是一種用于檢測圖像中幾何形狀(如直線、圓)的特征提取技術。其核心思想是將圖像空間中的點映射到參數空間(霍夫空間),通過累積投票機制識別形…

Java WEB技術-序列化和反序列化認識(SpringBoot的Jackson序列化行為?如何打破序列化過程的駝峰規則?如何解決學序列化循環引用問題?)

一、什么是序列化和反序列化 在java項目中,對象序列化和反序列化通常用于對象的存儲或網絡傳輸等。如:服務端創建一個JSON對象,對象如何在網絡中進行傳輸呢?我們知道網絡傳輸的數據通常都是字節流的形式,對象想要在網絡…