Python提取数字图片特征向量 | kTWO-个人博客

标签: | 发表时间:2018-08-13 13:51 | 作者:
出处:https://www.k2zone.cn

u=2579025859,808111110&fm=26&gp=0.jpg

引言

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

图片灰度化

blob.png => blob.png

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

      
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)

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

打印的数组形式如下:

blob.png

图片的二值化

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

blob.png

图片的像素是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就是上面提到的阈值。

二值化后的数组:

blob.png

在数组中我们可以大似的看到,数字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)

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

blob.png

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

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

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

输出结果:

blob.png

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

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

      
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-个人博客

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

用Python爬取微博数据生成词云图片

- - 编程学习网
很早之前写过一篇怎么利用微博数据制作词云图片出来,之前的写得不完整,而且只能使用自己的数据,现在重新整理了一下,任何的微博数据都可以制作出来,放在今天应该比较应景. 一年一度的虐汪节,是继续蹲在角落默默吃狗粮还是主动出击告别单身汪加入散狗粮的行列就看你啦,七夕送什么才有心意,程序猿可以试试用一种特别的方式来表达你对女神的心意.

[利用 Python 快速制作游戏字库](一)基础篇+分割字库图片

- cong - python.cn(jobs, news)
其实早就打算写相关文章的,但因为抽不出时间还是一直没动笔. 最近又想起来,然后翻开近半年前的草稿一看,居然一字未动. 现在回想起来,当初定的目标似乎太遥远了,所以我打算把原来准备一次写完的内容拆成一小段一小段来写. 这样有空就写一小段,似乎更实际一点. 在开始读这篇心得前,本人假定你对Python语言已有足够的了解,并已能写一些小程序;清楚游戏字库特别是图片类字库的原理、构造、作用,已做过或有充分准备可以制作一种字库.

dropbox讲python

- chuang - Initiative
dropbox定制优化CPython虚拟机,自己搞了个malloc调度算法. 那个 !!!111cos(0). 期待这次PyCon China 2011.

Python调试

- - 企业架构 - ITeye博客
原文地址: http://blog.csdn.net/xuyuefei1988/article/details/19399137. 1、下面网上收罗的资料初学者应该够用了,但对比IBM的Python 代码调试技巧:. IBM:包括 pdb 模块、利用 PyDev 和 Eclipse 集成进行调试、PyCharm 以及 Debug 日志进行调试:.

Python WSGI 初探

- - 坚实的幻想
在构建 Web 应用时,通常会有 Web Server 和 Application Server 两种角色. 其中 Web Server 主要负责接受来自用户的请求,解析 HTTP 协议,并将请求转发给 Application Server,Application Server 主要负责处理用户的请求,并将处理的结果返回给 Web Server,最终 Web Server 将结果返回给用户.

Python实现逻辑回归(Logistic Regression in Python)

- - 神刀安全网
Logistic Regression in Python ,作了中文翻译,并相应补充了一些内容. 本文并不研究逻辑回归具体算法实现,而是使用了一些算法库,旨在帮助需要用Python来做逻辑回归的训练和预测的读者快速上手. 逻辑回归是一项可用于预测二分类结果(binary outcome)的统计技术,广泛应用于金融、医学、犯罪学和其他社会科学中.

python 下载文件

- Eric - python相关的python 教程和python 下载你可以在老王python里寻觅
之前给大家分享的python 多线程抓取网页,我觉的大家看了以后,应该会对python 抓取网页有个很好的认识,不过这个只能用python 来抓取到网页的源代码,如果你想用做python 下载文件的话,上面的可能就不适合你了,最近我在用python 做文件下载的时候就遇到这个问题了,不过最终得以解决,为了让大家以后碰过这个问题有更好的解决办法,我把代码发出来:.

python代码调试

- - 阿里古古
【转自: http://blog.csdn.net/luckeryin/article/details/4477233】. 本文讨论在没有方便的IDE工具可用的情况下,使用pdb调试python程序. 例如,有模拟税收计算的程序:. debug_demo函数计算4500的入账所需的税收. 在需要插入断点的地方,加入红色部分代码:如果_DEBUG值为True,则在该处开始调试(加入_DEBUG的原因是为了方便打开/关闭调试).

python编程规范

- - 互联网 - ITeye博客
@FileName: @Author:[email protected] @Create date: @description:用一行文字概述模块或脚本,用句号结尾. 不影响编码的效率,不与大众习惯冲突.. 使代码的逻辑更清晰,更易于理解..   *所有的 Python 脚本文件都应在文件头标上如下标识或其兼容格式的标识.