思路

通过Python实现KNN算法。而KNN算法就是K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别。详情可在上一篇文章开头有介绍:

https://www.jianshu.com/p/bddf84a60efc

转载请注明出处:Michael孟良

准备

在Java项目里写了一个RGBUtils的class,将32x32像素的图片全部数字化输出:

package com.yml.common;

import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

public class RGBUtils {

public static void main(String[]args){

try {

BufferedImage bi = ImageIO.read(new File("D:\\workspace\\Utils\\src\\com\\yml\\common\\9_1.png"));

String picString = "";

for (int i = 0; i < 32; i++) {

for (int j = 0; j < 32; j++) {

picString += getRGB(bi, j, i);

}

picString += "\r\r\n";

}

System.out.println(picString);

} catch (IOException e) {

e.printStackTrace();

}

}

public static int getRGB(BufferedImage image, int x, int y) {

int[] rgb = null;

if (image != null && x < image.getWidth() && y < image.getHeight()) {

rgb = new int[3];

int pixel = image.getRGB(x, y);

rgb[0] = (pixel & 0xff0000) >> 16;

rgb[1] = (pixel & 0xff00) >> 8;

rgb[2] = (pixel & 0xff);

}

if(null!=rgb&&255==rgb[0]&&255==rgb[1]&&255==rgb[2]){

return 0;

}else{

return 1;

}

}

}

这是我在PS新建的32x32像素的数字9:

数字9

黑色是1白色是0,执行上述java类后得到

数字9

JAVA代码:https://github.com/MichaelYipInGitHub/PythonTest/blob/master/com/test/knn/JavaUtils/RGBUtils.java

要放到java项目里跑

如此这般我写了三个字一个5两个9,将他们变成TXT文件再TestData文件夹下

代码(Python)

# coding:utf-8

import os

import numpy as np

# 此方法将每个文件中32*32的矩阵数据,转换到1*1024一行中

from com.test.knn.KNNArcheyTest import classify

def img2vector(filename):

# 创建一个1行1024列的矩阵

returnVect = np.zeros((1, 1024))

# 打开当前的文件

fr = open(filename, "rb")

# 每个文件中有32行,每行有32列数据,遍历32个行,将32个列数据放入1024的列中

for i in range(32):

lineStr = fr.readline()

for j in range(32):

returnVect[0, 32 * i + j] = int(lineStr[j])

return returnVect

def IdentifImg():

labels = []

# 读取训练集 TrainData目录下所有的文件和文件夹

trainingFileList = os.listdir('TrainData')

m = len(trainingFileList)

# zeros((m,1024)) 返回一个m行 ,1024列的矩阵,默认是浮点型的

trainingMat = np.zeros((m, 1024))

for i in range(m):

# 获取文件名称 0_0.txt

fileNameStr = trainingFileList[i]

# 获取文件除了后缀的名称

fileStr = fileNameStr.split('.')[0]

# 获取文件"数字"的类别

classNumStr = int(fileStr.split('_')[0])

labels.append(classNumStr)

# 构建训练集, img2vector 每个文件返回一行数据 1024列

trainingMat[i, :] = img2vector('TrainData/%s' % fileNameStr)

# 读取测试集数据

testFileList = os.listdir('TestData')

errorCount = 0.0

mTest = len(testFileList)

for i in range(mTest):

fileNameStr = testFileList[i] #0_0.txt

fileStr = fileNameStr.split('.')[0]

classNumStr = int(fileStr.split('_')[0])

vectorUnderTest = img2vector('TestData/%s' % fileNameStr)

classifierResult = classify(vectorUnderTest, trainingMat, labels, 5)

print("识别出的数字是: %d, 真实数字是: %d" % (classifierResult, classNumStr))

if (classifierResult != classNumStr):

errorCount += 1.0

print("\n识别错误次数 %d" % errorCount)

errorRate = errorCount / float(mTest)

print("\n正确率: %f" % (1 - errorRate))

if __name__ == '__main__':

IdentifImg()

思路

首先将32x32像素的图片转变成一行1024(=32x32)空间坐标,其实就相当于一个1024维的空间。TainData 里面有两千条数据就相当于有两千个点。

我们新建一个方法叫classify,就是把我们要测试的点放到训练数据空间里,看离他最近的k个点是什么值,这里我们K设置为5

# normData 测试数据集的某行, dataSet 训练数据集 ,labels 训练数据集的类别,k k的值

def classify(normData, dataSet, labels, k):

# 计算行数

dataSetSize = dataSet.shape[0]

# print ('dataSetSize 长度 =%d'%dataSetSi ; vzvz ze)

# 当前点到所有点的坐标差值 ,np.tile(x,(y,1)) 复制x 共y行 1列

diffMat = np.tile(normData, (dataSetSize, 1)) - dataSet

# 对每个坐标差值平方

sqDiffMat = diffMat ** 2

# 对于二维数组 sqDiffMat.sum(axis=0)指 对向量每列求和,sqDiffMat.sum(axis=1)是对向量每行求和,返回一个长度为行数的数组

# 例如:narr = array([[ 1., 4., 6.],

# [ 2., 5., 3.]])

# narr.sum(axis=1) = array([ 11., 10.])

# narr.sum(axis=0) = array([ 3., 9., 9.])

sqDistances = sqDiffMat.sum(axis=1)

# 欧式距离 最后开方

distance = sqDistances ** 0.5

# x.argsort() 将x中的元素从小到大排序,提取其对应的index 索引,返回数组

# 例: tsum = array([ 11., 10.]) ---- tsum.argsort() = array([1, 0])

sortedDistIndicies = distance.argsort()

# classCount保存的K是魅力类型 V:在K个近邻中某一个类型的次数

classCount = {}

for i in range(k):

# 获取对应的下标的类别

voteLabel = labels[sortedDistIndicies[i]]

# 给相同的类别次数计数

classCount[voteLabel] = classCount.get(voteLabel, 0) + 1

# sorted 排序 返回新的list

# sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)

sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True)

return sortedClassCount[0][0]

我之前写的3的数字也变成1024维空间的点,选择最近的五个点进行判断。

输出结果

原来图片

代码

总结

1.Python没用封装KNN 算法, 因为太简单,可以直接手写。

2.从图片上看, 我用粗笔写的数字能识别到,细笔写的就识别不到,这可能与我的训练数据多为粗笔字体。

3.数字识别可以引申到动物识别,人物识别,不过他们用的像素不只是0和1,数据会更加庞大, 算法更加复杂。

python 仪表数字识别,利用Python进行数字识别相关推荐

  1. Python语言学习:利用python获取当前/上级/上上级目录路径(获取路径下的最后叶目录的文件名、合并两个不同路径下图片文件名等目录/路径案例、正确加载图片路径)之详细攻略

    Python语言学习:利用python获取当前/上级/上上级目录路径(获取路径下的最后叶目录的文件名.合并两个不同路径下图片文件名等目录/路径案例.正确加载图片路径)之详细攻略 目录 利用python ...

  2. Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法

    Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)-命令提示符cmd的几种方法 目录 利用python语言实现调用内部命令-命令提示符cmd的几种方法 T1. ...

  3. 用python做数据分析pdf_利用python进行数据分析pdf

    利用python进行数据分析pdf微盘下载!<利用python进行数据分析>利用Python实现数据密集型应用由浅入深帮助读者解决数据分析问题~适合刚刚接触Python的分析人员以及刚刚接 ...

  4. Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件

    Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 目录 利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 1.先下载ff ...

  5. python头像右上角加红色数字_利用python实现微信头像加红色数字功能

    通过Python实现将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果 实现过程: 准备两张图片如下: 使用PIL图像处理库,导入moudle ...

  6. 怎样组合数字python_利用python实现数字组合

    需求:假设让用户输入两次数字,第一次为12,第二次为34,实现的组合为13,14,23,24: 即第一次输入的每一个数字与第2次输入的每一个数字进行俩俩组合. num1 = input('请输入0-9 ...

  7. python实现图像识别_利用Python进行简单的图像识别(验证码)

    这是一个最简单的图像识别,将图片加载后直接利用Python的一个识别引擎进行识别 将图片中的数字通过 pytesseract.image_to_string(image)识别后将结果存入到本地的txt ...

  8. python扫雷脚本_利用 Python 实现 自动扫雷 小脚本

    原标题:利用 Python 实现 自动扫雷 小脚本 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式.一.准备工作1.扫雷游戏 我是 ...

  9. python自动扫雷_利用Python实现自动扫雷

    自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 我的版本是 python 3.6.1 python的第三方库: w ...

最新文章

  1. Python:Scrapy Shell
  2. js ajax 递归,javascript ajax循环请求/ 长轮询终极解决办法——递归
  3. Failed building wheel for netifaces
  4. 证明并推导汉诺塔(河内之塔)问题公式
  5. 95% CI, 置信区间 Confidence Interval
  6. Hive之DDL数据操作
  7. 《剑指offer》两个链表的第一个公共节点
  8. MySQL explain 命令
  9. mysql 执行计划_mysql执行计划
  10. android 防止重复启动app,Android应用开发Android 防止启动页面(SplashActivity)被多次启动...
  11. 取得textarea中行的三种写法
  12. 计算机网络按信息传输介质的性能来划分,第3章 计算机网络基础和 Internet 应用...
  13. Bailian2746 约瑟夫问题【 约瑟夫问题】
  14. android架构图示
  15. MS SQL SERVER中删除存在的临时表
  16. oracle报错12516,Oracle连接数太多报错-ORA-12516异常
  17. jdk StringBuilder实现
  18. 加动画喽。。有一次我设定动画的时间不管用。就把设置时间的代码位置调整到最开始。然后就好了。...
  19. Vysor Pro 手工破解-简单至极的方法
  20. 大学生发明文言文编程语言!李白杜甫棺材板压不住啦!

热门文章

  1. 原链YCC战略定位:公链+私链(联盟链、私有链),实现价值传递
  2. UserWarning: Ignoring URL ‘xxx‘ since it exceeds Excel‘s limit of 65,530 URLS per worksheet.
  3. 学校计算机培训计划怎么写,学校计算机培训计划_共3篇.doc
  4. java web树形图查询_Javaweb生成族谱树形图
  5. python实现读取文件英文词频统计并写入到文件
  6. 大学生的福音,学习 Java 最强书单推荐,附学习方法
  7. 32631、32649分别代表什么坐标系?
  8. Web(一)Web前端开发概述
  9. vue发送请求时遇到index.vue6ced90 Uncaught (in promise) TypeError Cannot read properties of undefined
  10. 浙江台州“安乐死”案承办法官首次披露庭审细节