基于KNN的手写数字模式识别设计与实现代码大全
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于模式识别系统的设计与实现
1.1 题目的主要研究内容
(1)运用KNN算法实现手写数字识别过程的主要描述:直接从sklearn 中加载自带的手写数字数据集,通过可视化的方式来查看图像的呈现;接着让数据规范化可以让数据都在同一个数量级的维度。将全部的图像数据作为特征值矩阵;最后通过训练可以得到KNN分类器,然后用测试集进行准确率的计算。下图是系统流程图:
(2)运用图像特征提取算法LBP,在图像颜色调成黑白色的基础上,以及使用像素点描绘图像和画出图像的大致轮廓。
1.2 题目研究的工作基础或实验条件
(1)硬件环境Win10 Intel(R)
(2)软件环境(开发工具python)
1.3 数据集描述
(1)手写数字数据集:
包含1797个0-9的手写数字数据,每个数据由8 * 8 大小的矩阵构成,矩阵中值的范围是0-16,代表颜色的深度。
(2)在网上下载的16张演员图像
1.4 特征提取过程描述
(1)手写数字数据集中的1797个数据,代表了0~9是个数字类别,每个数据由8 * 8 大小的矩阵构成,矩阵中值的范围是0-16,代表颜色的深度,颜色越深,矩阵中的值越大。根据颜色的深度可以描绘出大致轮廓,因此可以判断此数据属于那一个数。
(2)运用cv2.cvtColor将原图像进行灰色处理,接着利用图像特征提取算法:LBP,实现在灰色图像的基础上用像素点处理,再用filters.sobel对图像进行轮廓的提取。
1.5 分类过程以及准确率描述
(1)通过上文的特征提取过程,将1797个包含0-9的手写数字的数据,识别出了0、1、2、3、4、5、6、7、8、9十个数,如果以0~9中的每个数代表一类,这样就把1797个数据集分成了0~9一共十个类别。分割数据,将25%的数据作为测试集,其余作为训练集,创建KNN分类器对准确率进行计算。
(2)无分类过程
1.6 主要程序代码(要求必须有注释)
(1)程序一:
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_digits
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
#加载数据
digits = load_digits()
data = digits.data
#数据探索
print(data.shape)
# 查看第七幅图像
print(digits.images[6])
# 第七幅图像代表的数字含义
print(digits.target[6])
# 将第七幅图像显示出来
plt.gray()
plt.imshow(digits.images[6])
plt.show()
# 分割数据,将25%的数据作为测试集,其余作为训练集
train_x, test_x, train_y, test_y = train_test_split(data, digits.target, test_size=0.25, random_state=33)
# 采用Z-Score规范化
ss = preprocessing.StandardScaler()
train_ss_x = ss.fit_transform(train_x)
test_ss_x = ss.transform(test_x)
# 创建KNN分类器
knn = KNeighborsClassifier(n_neighbors=4)
knn.fit(train_ss_x, train_y)
predict_y = knn.predict(test_ss_x)
print("KNN准确率: %.4lf" % accuracy_score(test_y, predict_y))
(2)程序二:
import skimage
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import cv2
# settings for LBP
radius = 1 # LBP算法中范围半径的取值
n_points = 8 * radius # 领域像素点数
# 读取图像
image = cv2.imread('D:\SogouDownload/a/16.jpeg')
#显示到plt中,需要从BGR转化到RGB,若是cv2.imshow(win_name, image),则不需要转化
#显示原图像
image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.subplot(111)
plt.imshow(image1)
plt.show()
#将图像颜色调成灰色
image = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
plt.subplot(111)
plt.imshow(image, plt.cm.gray)
plt.show()
#利用像素点描绘图像
lbp = local_binary_pattern(image, n_points, radius)
plt.subplot(111)
plt.imshow(lbp, plt.cm.gray)
plt.show()
#进行轮廓提取
edges = filters.sobel(image)
plt.subplot(111)
plt.imshow(edges, plt.cm.gray)
plt.show()
1.7 运行结果及分析