600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > python抓取图片数字_Python提取数字图片特征向量 | kTWO-个人博客

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

时间:2018-07-12 19:19:44

相关推荐

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

引言

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

图片灰度化

=>

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

2

3

4

5

6

7

8

9

10

11 fromPILimportImage

importnumpyasnp

#打开一张图片

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

#图片灰度化

img=img.convert("L")

#显示图片

img.show()

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

printnp.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)

printimg_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 #将二值化后的数组转化成网格特征统计图

defget_features(array):

#拿到数组的高度和宽度

h,w=array.shape

data=[]

forxinrange(0,w/4):

offset_y=x*4

temp=[]

foryinrange(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)

returnnp.asarray(data)

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

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

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

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

printfeatures_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 fromPILimportImage

importnumpyasnp

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

defget_features(array):

#拿到数组的高度和宽度

h,w=array.shape

data=[]

forxinrange(0,w/4):

offset_y=x*4

temp=[]

foryinrange(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)

returnnp.asarray(data)

#打开一张图片

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

#将图片化为32*32的

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

#二值化

img=img.point(lambdax:1ifx>120else0)

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

img_array=np.asarray(img)

printimg_array

#得到网格特征统计图

features_array=get_features(img_array)

printfeatures_array

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

printfeatures_vector

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。