基于KNN的手写数字模式识别设计与实现代码大全

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 运行结果及分析

相关文档
最新文档