我們先來看兩個函數reshape和flatten:
假設我們先生成一個一維數組:
vec=np.arange(15) print vec
顯示為:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
如果我們要把這個一維數組,變成一個3*5二維矩陣,我們可以使用reshape來實現
mat= vec.reshape(3,5) print mat
顯示為
[[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]]
現在如果我們返過來,知道一個二維矩陣,要變成一個一維數組,就不能用reshape了,只能用flatten. 我們來看兩者的區別
a1=mat.reshape(1,-1) #-1表示為任意,讓系統自動計算 print a1 a2=mat.flatten() print a2
顯示為:
a1: [[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]] a2: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
可以看出,用reshape進行變換,實際上變換后還是二維數組,兩個方括號,因此只能用flatten.
我們要對圖像求直方圖,就需要先把圖像矩陣進行flatten操作,使之變為一維數組,然后再進行統計。
一、畫灰度圖直方圖
繪圖都可以調用matplotlib.pyplot庫來進行,其中的hist函數可以直接繪制直方圖。
調用方式:
n, bins, patches = plt.hist(arr, bins=50, normed=1, facecolor='green', alpha=0.75)
hist的參數非常多,但常用的就這五個,只有第一個是必須的,后面四個可選
arr: 需要計算直方圖的一維數組
bins: 直方圖的柱數,可選項,默認為10
normed: 是否將得到的直方圖向量歸一化。默認為0
facecolor: 直方圖顏色
alpha: 透明度
返回值 :
n: 直方圖向量,是否歸一化由參數設定
bins: 返回各個bin的區間范圍
patches: 返回每個bin里面包含的數據,是一個list
from PIL import Image import numpy as np import matplotlib.pyplot as plt img=np.array(Image.open('d:/pic/lena.jpg').convert('L')) plt.figure("lena") arr=img.flatten() n, bins, patches = plt.hist(arr, bins=256, normed=1, facecolor='green', alpha=0.75) plt.show()

二、彩色圖片直方圖
實際上是和灰度直方圖一樣的,只是分別畫出三通道的直方圖,然后疊加在一起。
from PIL import Image import numpy as np import matplotlib.pyplot as plt src=Image.open('d:/ex.jpg') r,g,b=src.split() plt.figure("lena") ar=np.array(r).flatten() plt.hist(ar, bins=256, normed=1,facecolor='r',edgecolor='r',hold=1) ag=np.array(g).flatten() plt.hist(ag, bins=256, normed=1, facecolor='g',edgecolor='g',hold=1) ab=np.array(b).flatten() plt.hist(ab, bins=256, normed=1, facecolor='b',edgecolor='b') plt.show()

由此可見,matplotlib的畫圖功能是非常強大的,直方圖只是其中非常小的一部分,更多的請參看官方文檔:
http://matplotlib.org/api/pyplot_summary.html
