Python提取数字图片特征向量
2017-11-10 15:40
465 查看
引言
在机器学习中有一种学习叫做手写数字识别,其主要功能就是让机器识别出图片中的数字,其步骤主要包括:图片特征提取、将特征值点阵转化为特征向量、进行模型训练。第一步便是提取图片中的特征提取。数据的预处理关系着后面模型的构建情况,所以,数据的处理也是机器学习中非常重要的一部分。下面我就说一下如何提取图片中的特征向量。图片灰度化
=>
当我们拿到一种图片的时候,这张图片可能是多种颜色集合在一起的,而我们为了方便处理这张图片,我们首先会将这张图片灰度化(左图灰度化之前,右图灰度化之后)。如果该图片已经是黑白两色的就可以省略此步骤。
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.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()方法即可:features_vector =features_array.reshape(features_array.shape[0]*features_array.shape[1]) print features_vector
输出结果:
有些同学可能要问,为什么要将二维的点阵转化成一维的特征向量? 这是因为在机器学习中,数据集的格式就是这样的,数据集的一个样例就是一个特征向量,对个样例组成一个训练集。转化为以为的特征向量是便于我们的使用。
全部代码(省略灰度化):
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
原文:http://www.k2zone.cn/?p=977
相关文章推荐
- python调用resnet模型 对人脸图片进行特征提取,提取全连接层特征向量
- 【Machine Learning】【Python】提取直方图特征做图片预分类(Decision Tree, Random Forest, Adaboost)
- 用python进行图片处理和特征提取
- Caffe图片特征提取(Python/C++)
- python实现图片处理和特征提取详解
- 【Python+OpenCV】图片局部区域像素值处理(改进版)-一种特征提取方法
- 训练好caffemodel后,提取人脸图片的特征向量
- python之验证码识别 特征向量提取和余弦相似性比较
- 使用python切割图片并自定义函数使用颜色矩提取图像的特征数据,为后期数据分析做准备
- 用python进行图片处理和特征提取
- 旋转不变LBP以及特征向量的提取方式
- python提取GIST特征,安装pyleargist包
- 自然语言处理︱简述四大类文本分析中的“词向量”(文本词特征提取)
- 利用卷积神经网络(CNN)提取图片特征
- 基于一种改进的提取形状特征向量方法,实现图像检索
- node2vec: 网络结构特征提取、论文、算法python实现
- caffe:使用C++来提取任意一张图片的特征
- 图片特征提取
- OpenCV Using Python——基于SURF特征提取和金字塔LK光流法的单目视觉三维重建
- 数字图像处理 边缘特征提取 Image edge detection