python-Numpy科學計算工具包,pickle模組
正如標題所言,Numpy是用於科學計算的,其中陣列物件對影象處理意義重大,還有線性代數函式等。在後面的所有機器學習中對影象的處理,都是基於這個庫的,介紹幾個簡單的例項。
影象陣列表示
呼叫array()方法:
im=array(Iamge.open('xxx.jpg'))
im=array(Iamge.open('xxx.jpg').convert('L'),'f')
注意:假設這是一張彩色影象,第一次開啟的是彩色影象,陣列中會儲存三個資訊。如(400,300,3)表示(行,列,顏色通道),後面還會有uint8 表示陣列元素的資料型別,無符號八位整數。第二行表示的是進行灰度轉換,此時就是灰度影象,沒有顏色資訊,(400,300),float32,因為 ’ f ‘將資料型別轉換為浮點型。
畫素可以通過下標訪問:
#k是通道數
value=im[i,j,k]
多陣列可以使用陣列切片訪問 使用:
im[:,i]=100 #將第i列所有數值設為100
im[i].mean() #第i行平均值
灰度變換
對灰度影象進行數學操作已達到某種效果。
#反相處理
im2=255-im
#將畫素值變換到100到200區間
im3=(100/255)*im+100
直方圖均衡化
指的是將影象的灰度直方圖變平,使得變換後的影象中每個灰度值的分佈概率相等。它是一種很好的歸一化方法,可以增強影象的對比度。
簡單來說:直方圖均衡化是將直方圖中畫素分佈集中的區域進行拉伸,分佈較少的區域進行壓縮,這對背景和前景太亮或太暗的影象好處很多,當然拉伸需要一個拉伸函式來重新計算概率分佈,這就需要累計分佈函式(CDF)。
舉個簡單例子來說明:
例如一幅影象有8個灰度級,分別0到7,0級有560個畫素值,佔總的畫素值概率為0.19,依次類推,8個灰度級概率之和為1,我們這樣處理,0級:0.19*7=1.33,最近取整為1,因此0級的畫素值全劃為1,1級:0.19*7+1級概率 *7 最近取整,其他以此類推。當然最後一個一定會是7,這樣就保證了不會增加新的級數。可以預見,當概率較小時,很容易被吞併。
當然,某些情況下均衡化並不一定是最好的方案,有時我們需要對某區間進行有目的的增強。此時我們需要直方圖規定化,也叫直方圖匹配。詳情請移步這裡
影象平均
影象平均是減少噪聲的一種簡單方式,思想是假設我們有一組大小相同的影象列表,我們將其簡單相加然後除以影象數目。
def compute_average(imlist):
averageim=array(Image.open(imlist[0],'f')
for imname in imlist[1:]:
try:
averageim+=array(Image.open(imname))
except :
print imname+ '...skipped'
averageim/=len(imlist)
return array(averageim,'uint8')
該程式提供了異常處理,自動跳過不能開啟的影象。
影象的主成分分析(PCA)
這是一個很常用的降維技巧,一副100×100的影象也有10000維,一兆畫素有百萬維,我們需要對其進行處理後再來使用,來降低演算法的開銷。請查詢PCA
pickle模組
我們在機器學習或者其他應用中,可能需要對一些結果或者資料進行儲存,pickle模組的作用就在這裡,它會把你的python物件轉換為字串表示,這個過程叫封裝,從字串中重構該物件,稱為拆封。
#儲存均值和主成分資料
with open('xxx.pkl','wb') as f:
pickle.dump(immean,f)
pickle.dump(V,f)
#開啟檔案並載入
with open('xxx.pkl','rb') as f:
immean =pickle.load(f)
V=pickle.load(f)