引言

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

图片灰度化

 =>

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

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的。如果不是要化为此值,这一步我们叫做尺寸归一化。

#打开一张图片
img = Image.open("numImage/3.jpg")
#将图片化为32*21的
img = img.resize((32, 32))
#二值化
img = img.point(lambda x:1 if x > 120 else 0)
#将图片转换为数组形式,元素为其像素的亮度值
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的网格特征数字统计图:

#将二值化后的数组转化成网格特征统计图def get_features(array):#拿到数组的高度和宽度h, w = array.shapedata = []for x in range(0, w/4):offset_y = x * 4temp = []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()方法即可:

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

输出结果:

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

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

from PIL import Imageimport numpy as np#将二值化后的数组转化成网格特征统计图def get_features(array):#拿到数组的高度和宽度h, w = array.shapedata = []for x in range(0, w/4):offset_y = x * 4temp = []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

原文:http://www.k2zone.cn/?p=977

Python提取数字图片特征向量相关推荐

  1. python抓取图片数字_Python提取数字图片特征向量 | kTWO-个人博客

    引言 在机器学习中有一种学习叫做手写数字识别,其主要功能就是让机器识别出图片中的数字,其步骤主要包括:图片特征提取.将特征值点阵转化为特征向量.进行模型训练.第一步便是提取图片中的特征提取.数据的预处 ...

  2. 用python实现数字图片识别神经网络--启动网络的自我训练流程,展示网络数字图片识别效果

    上一节,我们完成了网络训练代码的实现,还有一些问题需要做进一步的确认.网络的最终目标是,输入一张手写数字图片后,网络输出该图片对应的数字.由于网络需要从0到9一共十个数字中挑选出一个,于是我们的网络最 ...

  3. 用python实现数字图片识别神经网络--实现网络训练功能

    上节我们完成了神经网络基本框架的搭建,当时剩下了最重要的一个接口train,也就是通过读取数据自我学习,进而改进网络识别效率的功能尚未实现,从本节开始,我们着手实现该功能. 自我训练过程分两步走,第一 ...

  4. python 提取出图片特定区域的平均rgb值

    首先原图如下:需要提取出十字架顶端的四个圆区域带颜色的平均rgb值,如果是白色的就不参与计算 import cv2 import numpy as np import imagesize from P ...

  5. python提取数字前6位_取Pandas列的前6位数

    我有一个任务是获取pandas中列的前6位数.但是,如果这个数字的长度小于6位数,它会在数字的末尾加一个十进制数.不幸的是,这对我以后的需求是不可接受的.在 我确信我可以用各种代码消除十进制,但随着数 ...

  6. python生成数字_Python生成数字图片代码分享

    本文向大家分享了几段Python生成数字图片的代码,喜欢的朋友可以参考.具体如下: 最终版本 # -*- coding:utf-8 -*- from PIL import Image,ImageFon ...

  7. python怎么加图片_python中如何保存图片

    一提到数字图像处理,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件.pyth ...

  8. python正则表达式提取数字比较好_python正则表达式从字符串中提取数字的思路详解...

    python从字符串中提取数字 使用正则表达式,用法如下: ## 总结 ## ^ 匹配字符串的开始. ## $ 匹配字符串的结尾. ## \b 匹配一个单词的边界. ## \d 匹配任意数字. ## ...

  9. Dataset之MNIST:MNIST(手写数字图片识别+ubyte.gz文件)数据集的下载(基于python语言根据爬虫技术自动下载MNIST数据集)

    Dataset之MNIST:MNIST(手写数字图片识别+ubyte.gz文件)数据集的下载(基于python语言根据爬虫技术自动下载MNIST数据集) 目录 数据集下载的所有代码 1.主文件 mni ...

最新文章

  1. Android开发之底部导航栏标准
  2. 第三章 改进神经网络的学习方式(上中)
  3. mysql gui tools 问题_Navicat与MySQL GUI Tools管理工具的优缺点对比
  4. 201803-2碰撞的小球
  5. 删除WSS卸载后遗留的数据库
  6. 21天实战人工智能系列:人工智能产品经理最佳实践(1)
  7. 收集程序员的几幅对联
  8. 【数据结构与算法】【算法思想】Dijkstra算法
  9. ios时间相差多少天_iOS 计算某个时间到现在是多少月/天/时
  10. 【华为云技术分享】如何度量前端项目研发效率与质量(上)
  11. VScode快捷键(持续更新)
  12. 蓝桥杯 ADV-120算法提高 6-17复数四则运算
  13. 《Java程序设计》第16周周四:GUI编程及文件对话框的使用
  14. Ansible之五:常用模块
  15. 汽车方向盘电子助力转向器如何接线_案例 | 看3D打印如何助力汽车电子连接器模具冷却水路的设计优化...
  16. windows安装补丁慢 360安全卫士和腾讯电脑管家安装同样卡住 解决办法
  17. 软件项目管理实用教程(人民邮电出版)第一章课后习题
  18. 判断用户端有无安装flash插件并返回对应播放器选项提示
  19. UI设计中的原型图用什么工具?怎么做?给谁看?
  20. PuTTY 下载安装教程

热门文章

  1. [leetcode]160.相交链表
  2. 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)
  3. Windows使用msi安装MySQL安装教程
  4. 表面粗糙度的基本评定参数是_表面粗糙度的概念,表面粗糙度形成因素,表面粗糙度评定依据...
  5. python比较两个二进制文件_python三种方法判断文件是否为二进制文件
  6. php上个月的最后一天,在PHP中查找上个月的最后一天
  7. c51语言if语句多条件使用,单片机if语句判断多个条件
  8. php 容器实现,PHP 依赖注入容器实现
  9. 底部分页栏_2020年执业药师考试教材各科目增加页数!最多203页
  10. ajax实现滚动刷新,jquery如何实现滚动自动加载