python的圖像處理教程?【導讀】專知成員Hui上一次為大家介紹Matplotlib的使用,包括繪圖,繪制點和線,以及圖像的輪廓和直方圖,這一次為大家詳細講解Numpy工具包中的各種工具,并且會舉實例說明如何應用numpy是非常有名的Python科學計算工具包,其中包含了大量有用的思想,比如數組對象(用來表示向量、矩陣、圖像等等)以及線性代數,通過本章節的學習也為之後進行複雜的圖像處理打下牢固的基礎,我來為大家科普一下關于python的圖像處理教程?下面希望有你要的答案,我們一起來看看吧!
【導讀】專知成員Hui上一次為大家介紹Matplotlib的使用,包括繪圖,繪制點和線,以及圖像的輪廓和直方圖,這一次為大家詳細講解Numpy工具包中的各種工具,并且會舉實例說明如何應用。numpy是非常有名的Python科學計算工具包,其中包含了大量有用的思想,比如數組對象(用來表示向量、矩陣、圖像等等)以及線性代數,通過本章節的學習也為之後進行複雜的圖像處理打下牢固的基礎。
「幹貨」計算機視覺實戰系列01——用Python做圖像處理
「幹貨」計算機視覺實戰系列02——用Python做圖像處理
Numpy基本操作和圖像灰度變換
Python中有好多工具包應用于圖像處理當中,本章作為入門章節,首先來介紹Python中最基本的幾個工具包,也希望讀者可以在之後自行練習。
▌Numpy
Numpy中的數組對象可以幫助我們進行數組的重要操作,比如矩陣乘積、轉置、解方程系統、向量乘積歸一化,通過這些操作,我們可以對圖像進行建模、圖像分類、圖像聚類等複雜的圖像處理工作。
▌Numpy的基本操作
Numpy在前面的文章中已有涉及,但是并沒有系統講解,今天,我們将詳細的對numpy庫的操作進行介紹。
首先介紹的是将 NumPy 導入為 np,并查看版本,代碼為:
numpy np
(np.)
numpy(Numerical Python)提供了python對多維數組對象的支持:ndarray,具有矢量運算能力,快速、節省空間。numpy支持高級大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。
基本操作的代碼如下:
numpy np a1 = np.array([]) a2 = np.array([[][]]) (a.shape) (a2.shape[]) (a2.shape[]) (a2[]) (a2[:]) b = a2[a2 > ] (b) a2[a2 > ] = (a2)
輸出結果為:
在上面的代碼中,我們通過np.array()函數可以創建一維和二維的narray對象,多維的對象也可以以此類推,這裡便不再多說;
要獲取narray對象的各維的長度,可以通過narray對象的shape屬性要獲取narray對象的各維的長度,可以通過narray對象的shape屬性;shape()中也可以傳入數字0或數字1,分别用來獲取數組的行數或者列數;
矩陣的截取和python中的list相同,可以通過[](方括号)來截取,這裡不再過多贅述;
這裡講一下按條件截取 ,按條件截取其實是在[](方括号)中傳入自身的布爾語句 ,按條件截取應用較多的是對矩陣中滿足一定條件的元素變成特定的值。 例如上面實例中的将矩陣中大于6的元素變成0。
方括号的用法相當靈活,例如:當我們需要從一個數組中提取所有的奇數元素時,我們采用如下代碼:
a2[a2 % 2 == 1]
矩陣中元素的替換方法也相當靈活,将上述代碼中截取的矩陣賦值,我們便可以實現矩陣元素的替換,代碼為:
arr[arr % 2 == 1] = -1
此外,我們用下述代碼也同樣可以實現替換功能:
out = np.where(arr % 2 == 1, -1, arr)
np.where 函數是三元表達式 x if condition else y的矢量化版本
result = np.where(cond,xarr,yarr)
當符合條件時是x,不符合是y,常用于根據一個數組産生另一個新的數組。
當數組的變動比較大時,替換功能并不能滿足我們的需求,我們就需要使用重塑方法,例如,将 1 維數組轉換成 2 維數組(兩行),代碼為:
a1.reshape(2, -1)
值得注意的是reshape中傳的參數-1其實沒有實際意義,而是隻定義了第一個參數的量——這個數組有兩行,然後我們并不用關心列數,而讓Numpy自己計算出新數組的列數。
通過reshape生成的新數組和原始數組公用一個内存,也就是說,假如更改一個數組的元素,另一個數組也将發生改變。
矩陣合并可以通過numpy中的hstack方法和vstack方法實現
代碼如下:
numpy np
a1 = np.array([[][]])
a2 = np.array([[][]])
(np.hstack([a1a2]))
(np.vstack((a1a2)))
輸出結果為:
矩陣的合并可以通過numpy中的hstack方法和vstack方法實現,此外, 矩陣的合并也可以通過concatenatef方法。
np.concatenate( (a1a2)=) 等價于 np.vstack( (a1a2) )
np.concatenate( (a1a2)=) 等價于 np.hstack( (a1a2) )
我們還可以通過函數創建矩陣,numpy模塊中自帶了一些創建ndarray對象的函數,可以很方便的創建常用的或有規律的矩陣。
arange函數用于創建等差數組,使用頻率非常高,arange非常類似range函數用法為,arange([start,] stop[, step,], dtype=None)根據start與stop指定的範圍以及step設定的步長,然後生成對象,例如:
a2 = np.arange(5,20,2) # 從5開始到20(不包括20),步長為2
linspace()和matlab的linspace很類似,用于創建指定數量等間隔的序列,實際生成一個等差數列,例如:
a = np.linspace(0,10,7) # 生成首位是0,末位是10,含7個數的等差數列
linspace用于生成等差數列,而logspace用于生成等比數列,例如:
a = np.logspace(0,2,5)
ones創建全1矩陣 zeros創建全0矩陣 eye創建單位矩陣 empty創建空矩陣(實際有值)
具體代碼為:
numpy np
a_ones = np.ones(()) (a_ones)
a_zeros = np.zeros(()) (a_zeros)
a_eye = np.eye() (a_eye)
a_empty = np.empty(()) (a_empty)
輸出結果為:
:矩陣對應元素相加
-:矩陣對應元素相減
*:矩陣對應元素相乘
/:矩陣對應元素相除,如果都是整數則取商
%:矩陣對應元素相除後取餘數
**:矩陣每個元素都取n次方,如**:每個元素都取平方
np.sin(a):對矩陣a中每個元素取正弦sin(x)
np.cos(a):對矩陣a中每個元素取餘弦cos(x)
np.tan(a):對矩陣a中每個元素取正切tan(x)
np.arcsin(a):對矩陣a中每個元素取反正弦arcsin(x)
np.arccos(a):對矩陣a中每個元素取反餘弦arccos(x)
np.arctan(a):對矩陣a中每個元素取反正切arctan(x)
np.exp(a):對矩陣a中每個元素取指數函數ex
np.sqrt(a):對矩陣a中每個元素開根号√x
矩陣乘法必須滿足矩陣乘法的條件,即第一個矩陣的列數等于第二個矩陣的行數。 矩陣乘法的函數為 dot ,代碼為:
numpy np
a1 = np.array([[][]]) a2 = np.array([[][][]]) (a1.shape[] == a2.shape[])
(a1.dot(a2))
運行結果為:
求矩陣的轉置我們用 a.transpose()來實現,此外, 矩陣的轉置還有更簡單的方法,就是a.T
求矩陣的逆需要先導入numpy.linalg,用linalg的inv函數來求逆。,矩陣求逆的條件是矩陣的行數和列數相同,具體代碼如下:
numpy np
numpy.linalg lg
a = np.array([[][][]])
(lg.inv(a))
輸出結果如下:
▌獲取矩陣中的元素信息
獲得矩陣中元素最大最小值的函數分别是max和min,可以獲得整個矩陣、行或列的最大最小值。 如:a.max()和a.min()其中,括号内我們還可以傳入我們想要的參數,axis=1或者axis=0,分别表示獲得每行的最大(小)值和獲得每列的最大(小)值
獲得矩陣中元素的平均值可以通過函數mean()。同樣地,可以通過傳入axis=0和axis=1參數獲得整個矩陣、行或列的平均值
方差的函數為var(),方差函數var()相當于函數mean(abs(x - x.mean())**2),其中x為矩陣。
标準差的函數為std(),std()相當于sqrt(mean(abs(x - x.mean())**2)),或相當于sqrt(x.var())。
中值指的是将序列按大小順序排列後,排在中間的那個值,如果有偶數個數,則是排在中間兩個數的平均值。例如序列[5,2,6,4,2],按大小順序排成 [2,2,4,5,6],排在中間的數是4,所以這個序列的中值是4。又如序列[5,2,6,4,3,2],按大小順序排成 [2,2,3,4,5,6],因為有偶數個數,排在中間兩個數是3、4,所以這個序列中值是3.5。中值的函數是median(),調用方法為numpy.median(x,[axis]),axis可指定軸方向,默認axis=None,對所有數去中值。
矩陣求和的函數是sum(),可以對行,列,或整個矩陣求和
某位置累積和指的是該位置之前(包括該位置)所有元素的和。
例如序列[1,2,3,4,5],其累計和為[1,3,6,10,15],即第一個元素為1,第二個元素為1 2=3,……,第五個元素為1 2 3 4 5=15。
矩陣求累積和的函數是cumsum(),可以對行,列,或整個矩陣求累積和。
▌圖像的數組表示
計算機在處理一幅圖像時,其實是處理的成千上萬個像素數據,當我們載入一幅圖像時,我們可以查看它的屬性和類型
當輸入如下代碼:
im = array(Image.open())
(im.shape)
(im.dtype)
我們就會有如下輸出:
括号中的三個數分别代表(行,列,顔色通道),dtype則顯示出數組元素的數據類型。
對于灰度圖像:
im = array(Image.open().convert())
(im.shape)
(im.dtype)
輸出結果為:
輸出此結果的原因是對圖像進行了灰度化處理,并且在創建數組時使用了額外的參數“f”将數據類型變成了浮點型。
▌灰度變換
将圖像讀入Numpy數組對象之後,我們可以對他們執行任意的數字操作,一個簡單的例子就是圖像的灰度變換。考慮任意函數f它将0...255區間(或者0...1區間)映射到自身(即輸入區間和輸出區間的範圍相同)。下面是關于灰度變換的一些例子。
請看下面代碼:
PIL Image
numpy *
image = array(Image.open().convert())
fig = plt.figure(=())
plt.subplot()
plt.imshow(image=cm.gray)
plt.axis()
plt.subplot()
image1 = - image
plt.imshow(image1=cm.gray)
plt.axis()
plt.subplot()
imgae2 = (image / ) * data2 = np.array(image2)
plt.imshow(data2=cm.gray)
plt.axis()
plt.subplot()
imgae3 = * (image / ) ** data3 = np.array(image3)
plt.imshow(data3=cm.gray)
plt.axis()
plt.show()輸出圖像如下:
上面的代碼中,我們首先讀入了一一副圖像并将它轉換成了灰度圖像,并且繪制出原始灰度圖像;
第二步,我們利用255減去每一個像素值便相當于對圖像進行了反相處理。在計算機中,當以RGB模式表示顔色時,反相的實現是用255(前提是R/G/B都是8位的)分别減去R,G,B的值,得到的即為反相對應的RGB值。對于灰度圖像來說,反相就是黑變白,白變黑,生成第二幅圖像;
第三步,我們将原始灰度圖像的像素值變換到(100,200)這個區間,生成第三幅圖像;
第四步,我們利用變換函數對灰度圖像進行變換,可以突出灰度圖像的某些特征。
變換函數的圖像如下圖左邊所示,右邊為對應變換後的圖像。
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!