python抓取图片数字_Python提取数字图片特征向量 | kTWO-个人博客
引言
在机器学习中有一种学习叫做手写数字识别,其主要功能就是让机器识别出图片中的数字,其步骤主要包括:图片特征提取、将特征值点阵转化为特征向量、进行模型训练。第一步便是提取图片中的特征提取。数据的预处理关系着后面模型的构建情况,所以,数据的处理也是机器学习中非常重要的一部分。下面我就说一下如何提取图片中的特征向量。
图片灰度化
=>
当我们拿到一种图片的时候,这张图片可能是多种颜色集合在一起的,而我们为了方便处理这张图片,我们首先会将这张图片灰度化(左图灰度化之前,右图灰度化之后)。如果该图片已经是黑白两色的就可以省略此步骤。 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-个人博客相关推荐
- python自动输入账号密码_Python如何基于selenium实现自动登录博客园
这篇文章主要介绍了Python如何基于selenium实现自动登录博客园,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需要做的准备: 本文章是使用 ...
- python多元线性回归实例_Python机器学习多元线性回归模型 | kTWO-个人博客
前言 在上一篇文章<机器学习简单线性回归模型>中我们讲解分析了Python机器学习中单输入的线性回归模型,但是在实际生活中,我们遇到的问题都是多个条件决定的问题,在机器学习中我们称之为多元 ...
- python socket模块作用_python之socket模块详解--小白博客
主要是创建一个服务端,在创建服务端的时候,主要步骤如下: 创建socket对象socket-->绑定IP地址和端口bind-->监听listen-->得到请求accept--> ...
- Python抓取图片
Python 抓取图片(记录) 记录过程,怕忘了.复制就能用. # coding=utf-8 import os import platform from multiprocessing.pool i ...
- python爬虫难度排行_【Python爬虫】爬了七天七夜,终于爬出了博客园粉丝数排行榜!...
[Python爬虫]爬了七天七夜,终于爬出了博客园粉丝数排行榜! 文章发出不到30分钟就被首页下架了,默哀-- 起因 为了督促自己更加积极地写博客,我希望有一个排名系统能让我看到自己的进步.但是博客园 ...
- python识别图片中数字_Python图像处理之图片验证码识别
在上一篇博客Python图像处理之图片文字识别(OCR)中我们介绍了在Python中如何利用Tesseract软件来识别图片中的英文与中文,本文将具体介绍如何在Python中利用Tesseract软件 ...
- python3抓取图片视频_Python opencv提取视频中的图片
#-*- coding: utf-8 -*- importosimport cv2 ##加载OpenCV模块 def video2frames(pathIn='', pathOut='', only_ ...
- python神奇时钟项目_Python Tkinter 数字时钟小项目
### 第1课 项目演示 ①演示项目 ②介绍项目功能 ### 第2课 主窗口[1] ①开发主窗口 ②设置窗口标题 ③设置窗口图标 ④固定窗口大小 ### 第3课 主窗口[2] ①设置窗口大小 ②实现窗 ...
- python识别银行卡数字_Python银行卡数字识别项目 (Opencv)
嫌弃b站无代码块看不清楚的各位可以去我的csdn博客上看.. https://blog.csdn.net/weixin_44543614/article/details/105471010 项目的预览 ...
最新文章
- docker 配置使用宿主机的GPU(ubuntu16.04+cuda10.0+cudnn7)
- Go 学习笔记(77)— Go 第三方库之 cronexpr(解析 crontab 表达式,定时任务)
- 网页调用本地播放器的代码支持ie,chroome, 火狐不支持
- CMake 学习笔记 —— 进阶
- LUA表与函数的深入理解
- linux统计使用最多的10个命令
- 五个值得放收藏夹吃灰的Go CheatSheet 站点
- Java笔记(二十) 注解
- susue linux防火墙,在64位的SUSUE下,g++编译的代码中,进入函数前的一段汇编让人费解,请高手解释一下?...
- SQL学习笔记之游标
- Aria2保姆级教程
- dna计算机 论文,科学网—阿德勒曼DNA计算机(科普) - 沈海军的博文
- Could not set property ‘XXX‘ of ‘class com.entity.XXX‘
- SpringBoot Mongo 动态分表 动态修改表名
- 如果将OpenGL的MVP矩阵设置为单位阵
- Maven整合阿里云云效制品仓库 Packages(私服)
- 几乎所有的互联网公司都在进行一场脱虚向实的全新嬗变
- SHA 256算法是什么?哈希算法有哪些特点,主要应用在哪里?
- 计算机对音乐课堂的帮助,电脑音乐在音乐教学中的应用
- ROS张瑞雷老师布置作业第一天作业
热门文章
- BGP路由属性之MED 实验分析
- Sitecore 9 智能易用
- 同是“千亿”目标:伊利势在必得,蒙牛恐难实现
- 中科点击:产业转移概述及产业转移承接的举措
- 我国物流管理软件的现状及发展趋势
- mysql特殊符号#
- 开始例程/结束例程/专家例程 都有啥区别
- C语言之结构体 现有36名教师,每个教师包括教工号,姓名,工资共三项基本信息,请用C语言编程,从键盘上输入每一位教师的基本信息,并打印输出工资最高者的工号,姓名工资和所有教师的平均工资
- Linux部署kms服务
- matlab16a使用教程,MATLAB R2016a完全自学一本通_IT教程网