引言

在机器学习中有一种学习叫做手写数字识别,其主要功能就是让机器识别出图片中的数字,其步骤主要包括:图片特征提取、将特征值点阵转化为特征向量、进行模型训练。第一步便是提取图片中的特征提取。数据的预处理关系着后面模型的构建情况,所以,数据的处理也是机器学习中非常重要的一部分。下面我就说一下如何提取图片中的特征向量。

图片灰度化

 =>

当我们拿到一种图片的时候,这张图片可能是多种颜色集合在一起的,而我们为了方便处理这张图片,我们首先会将这张图片灰度化(左图灰度化之前,右图灰度化之后)。如果该图片已经是黑白两色的就可以省略此步骤。 1

2

3

4

5

6

7

8

9

10

11 from PIL import Image

import numpy as np

#打开一张图片

img = Image.open("image/77.jpg")

#图片灰度化

img = img.convert("L")

#显示图片

img.show()

#将图片转换为数组形式,元素为其像素的亮度值

print np.asarray(img)

在图片灰度化之前这张图片的数组值应该是一个三维的,灰度化之后将变为二维数组。数组行列数就是图片的像素宽度和高度。

打印的数组形式如下:

图片的二值化

图片的二值化就是将上面的数组化为0和1的形式,转化之前我们要设定一个阈值,大于这个阈值的像素点我们将其设置为1,小于这个阈值的像素点我们将其设置为0。下面我找了一张数字的图片,这张图片已经灰度化过了。我们就直接将它二值化。图片如下:

图片的像素是32x32的。如果不是要化为此值,这一步我们叫做尺寸归一化。 1

2

3

4

5

6

7

8 #打开一张图片

img = Image.open("numImage/3.jpg")

#将图片化为32*21的

img = img.resize((32, 32))

#二值化

#将图片转换为数组形式,元素为其像素的亮度值

img_array = np.asarray(img)

print img_array

解释一下上面的代码,resize方法里的参数是一个元组,元素分别是宽和高;point函数是用来二值化图片的,其参数是一个lambda函数,函数体就是判断其元素值是否大于120,这里的120就是上面提到的阈值。

二值化后的数组:

在数组中我们可以大似的看到,数字1大似组成了一个3的形状。

获取网格特征数字统计图

在图片二值化之后,我们通常需要获取到网格统计图,这里我们的图片尺寸是32*32的,所以我们将其化为8*8的点阵图,步骤如下:

1、将二值化后的点阵水平平均划线分成8份,竖直平均划线分成8份。

2、分别统计每一份中像素点为1的个数。

3、将每一个份统计值组合在一起,构成8*8的点阵统计图。

下面我写了个函数来将32*32的数组转化成8*8的网格特征数字统计图: 1

2

3

4

5

6

7

8

9

10

11

12

13

14 #将二值化后的数组转化成网格特征统计图

def get_features(array):

#拿到数组的高度和宽度

h, w = array.shape

data = []

for x in range(0, w/4):

offset_y = x * 4

temp = []

for y in range(0,h/4):

offset_x = y * 4

#统计每个区域的1的值

temp.append(sum(sum(array[0+offset_y:4+offset_y,0+offset_x:4+offset_x])))

data.append(temp)

return np.asarray(data)

转化之后我们的到的数组点阵是这样的:

将二维的统计图转化为一维的特征向量

这一步就比较简单了,只需要将矩阵全部放到一行即可,直接使用np的reshape()方法即可: 1

2 features_vector =features_array.reshape(features_array.shape[0]*features_array.shape[1])

print features_vector

输出结果:

有些同学可能要问,为什么要将二维的点阵转化成一维的特征向量? 这是因为在机器学习中,数据集的格式就是这样的,数据集的一个样例就是一个特征向量,对个样例组成一个训练集。转化为以为的特征向量是便于我们的使用。

全部代码(省略灰度化): 1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34 from PIL import Image

import numpy as np

#将二值化后的数组转化成网格特征统计图

def get_features(array):

#拿到数组的高度和宽度

h, w = array.shape

data = []

for x in range(0, w/4):

offset_y = x * 4

temp = []

for y in range(0,h/4):

offset_x = y * 4

#统计每个区域的1的值

temp.append(sum(sum(array[0+offset_y:4+offset_y,0+offset_x:4+offset_x])))

data.append(temp)

return np.asarray(data)

#打开一张图片

img = Image.open("numImage/3.jpg")

#将图片化为32*32的

img = img.resize((32, 32))

#二值化

img = img.point(lambda x:1 if x > 120 else 0)

#将图片转换为数组形式,元素为其像素的亮度值

img_array = np.asarray(img)

print img_array

#得到网格特征统计图

features_array = get_features(img_array)

print features_array

features_vector =features_array.reshape(features_array.shape[0]*features_array.shape[1])

print features_vector

最后送上手写数字训练集图片链接:

python抓取图片数字_Python提取数字图片特征向量 | kTWO-个人博客相关推荐

  1. python自动输入账号密码_Python如何基于selenium实现自动登录博客园

    这篇文章主要介绍了Python如何基于selenium实现自动登录博客园,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需要做的准备: 本文章是使用 ...

  2. python多元线性回归实例_Python机器学习多元线性回归模型 | kTWO-个人博客

    前言 在上一篇文章<机器学习简单线性回归模型>中我们讲解分析了Python机器学习中单输入的线性回归模型,但是在实际生活中,我们遇到的问题都是多个条件决定的问题,在机器学习中我们称之为多元 ...

  3. python socket模块作用_python之socket模块详解--小白博客

    主要是创建一个服务端,在创建服务端的时候,主要步骤如下: 创建socket对象socket-->绑定IP地址和端口bind-->监听listen-->得到请求accept--> ...

  4. Python抓取图片

    Python 抓取图片(记录) 记录过程,怕忘了.复制就能用. # coding=utf-8 import os import platform from multiprocessing.pool i ...

  5. python爬虫难度排行_【Python爬虫】爬了七天七夜,终于爬出了博客园粉丝数排行榜!...

    [Python爬虫]爬了七天七夜,终于爬出了博客园粉丝数排行榜! 文章发出不到30分钟就被首页下架了,默哀-- 起因 为了督促自己更加积极地写博客,我希望有一个排名系统能让我看到自己的进步.但是博客园 ...

  6. python识别图片中数字_Python图像处理之图片验证码识别

    在上一篇博客Python图像处理之图片文字识别(OCR)中我们介绍了在Python中如何利用Tesseract软件来识别图片中的英文与中文,本文将具体介绍如何在Python中利用Tesseract软件 ...

  7. python3抓取图片视频_Python opencv提取视频中的图片

    #-*- coding: utf-8 -*- importosimport cv2 ##加载OpenCV模块 def video2frames(pathIn='', pathOut='', only_ ...

  8. python神奇时钟项目_Python Tkinter 数字时钟小项目

    ### 第1课 项目演示 ①演示项目 ②介绍项目功能 ### 第2课 主窗口[1] ①开发主窗口 ②设置窗口标题 ③设置窗口图标 ④固定窗口大小 ### 第3课 主窗口[2] ①设置窗口大小 ②实现窗 ...

  9. python识别银行卡数字_Python银行卡数字识别项目 (Opencv)

    嫌弃b站无代码块看不清楚的各位可以去我的csdn博客上看.. https://blog.csdn.net/weixin_44543614/article/details/105471010 项目的预览 ...

最新文章

  1. docker 配置使用宿主机的GPU(ubuntu16.04+cuda10.0+cudnn7)
  2. Go 学习笔记(77)— Go 第三方库之 cronexpr(解析 crontab 表达式,定时任务)
  3. 网页调用本地播放器的代码支持ie,chroome, 火狐不支持
  4. CMake 学习笔记 —— 进阶
  5. LUA表与函数的深入理解
  6. linux统计使用最多的10个命令
  7. 五个值得放收藏夹吃灰的Go CheatSheet 站点
  8. Java笔记(二十) 注解
  9. susue linux防火墙,在64位的SUSUE下,g++编译的代码中,进入函数前的一段汇编让人费解,请高手解释一下?...
  10. SQL学习笔记之游标
  11. Aria2保姆级教程
  12. dna计算机 论文,科学网—阿德勒曼DNA计算机(科普) - 沈海军的博文
  13. Could not set property ‘XXX‘ of ‘class com.entity.XXX‘
  14. SpringBoot Mongo 动态分表 动态修改表名
  15. 如果将OpenGL的MVP矩阵设置为单位阵
  16. Maven整合阿里云云效制品仓库 Packages(私服)
  17. 几乎所有的互联网公司都在进行一场脱虚向实的全新嬗变
  18. SHA 256算法是什么?哈希算法有哪些特点,主要应用在哪里?
  19. 计算机对音乐课堂的帮助,电脑音乐在音乐教学中的应用
  20. ROS张瑞雷老师布置作业第一天作业

热门文章

  1. BGP路由属性之MED 实验分析
  2. Sitecore 9 智能易用
  3. 同是“千亿”目标:伊利势在必得,蒙牛恐难实现
  4. 中科点击:产业转移概述及产业转移承接的举措
  5. 我国物流管理软件的现状及发展趋势
  6. mysql特殊符号#
  7. 开始例程/结束例程/专家例程 都有啥区别
  8. C语言之结构体 现有36名教师,每个教师包括教工号,姓名,工资共三项基本信息,请用C语言编程,从键盘上输入每一位教师的基本信息,并打印输出工资最高者的工号,姓名工资和所有教师的平均工资
  9. Linux部署kms服务
  10. matlab16a使用教程,MATLAB R2016a完全自学一本通_IT教程网