用python簡單處理圖片(5):圖像直方圖


我們先來看兩個函數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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM