Python提取数字图片特征向量
引言
在機器學習中有一種學習叫做手寫數字識別,其主要功能就是讓機器識別出圖片中的數字,其步驟主要包括:圖片特征提取、將特征值點陣轉化為特征向量、進行模型訓練。第一步便是提取圖片中的特征提取。數據的預處理關系著后面模型的構建情況,所以,數據的處理也是機器學習中非常重要的一部分。下面我就說一下如何提取圖片中的特征向量。
圖片灰度化
?=>
當我們拿到一種圖片的時候,這張圖片可能是多種顏色集合在一起的,而我們為了方便處理這張圖片,我們首先會將這張圖片灰度化(左圖灰度化之前,右圖灰度化之后)。如果該圖片已經是黑白兩色的就可以省略此步驟。
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提取数字图片特征向量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows下的使用别人编译好的库文件
- 下一篇: Jython调用不包含第三方库的pyth