使用Numpy和Opencv完成基本圖像的數據分析(Part I)
對于深度學習而言,很多任務都是與數字圖形處理打交道。這類任務的數據集一般是由很多張圖像構成,有時候,當原始圖像不能直接送入模型中時,需要對其進行一定的預處理操作,這時候就不得不向大家介紹一個十分有用的軟件包OpenCV,用它處理圖像起來非常方便,OpenCV是一個基于BSD許可發行的跨平臺計算機視覺庫,它輕量且高效,是由一系列C函數和少量C++類構成,支持Python、MATLAB等語言接口,內部包含了很多圖像處理的相關算法。下面將向大家介紹如何使用NumPy和OpenCV對數字圖像進行簡單的處理方法:
關于像素的一些知識
在程序世界里,圖像輸入到計算機中時,與人眼所見的圖像的形式不太一樣。計算機將圖像存儲為類似于馬賽克的小方塊,就像古老的方塊馬賽克藝術的形式。如果方形塊太大,那么就很難制作出光滑的邊緣和曲線。使用的方塊越小,則越平滑,或者說圖像的像素就越少,方塊的大小有時候也被稱為圖像的分辨率。
矢量圖像是存儲圖像的一些不同方法,目的是為了避免與像素相關的問題。但是,即使是矢量圖像,最終也會顯示為像素級的馬賽克。像素一詞表示圖像元素,描述每個像素的簡單方法是使用三種顏色的組合,即紅色(Red),綠色(Green),藍色(Blue),即我們平時所說的RGB圖像。
在RGB圖像中,每個像素由分別與紅色,綠色,藍色的值相關聯的三個8比特數表示。假設使用放大鏡觀察,如果我們放大圖片,就會看到圖片是由微小的光點或更加具體的像素組成,更有趣的是,看到的那些小光點實際上是多個微小不同顏色的小光點,且顏色只有紅色、綠色和藍色。
假設現在從遠處觀察,創建一張圖像,可以看到一張圖像實際上由像素點值的開關決定(像素值為1表示開,像素值為0表示關),這些開關組合創建了圖像,基本上,我們每天在屏幕上看到的圖像都是這種。
每張圖像都以數字形式的像素組成,像素是構成圖片的最小信息單位,通常是圓形或方形,且位于二維網格中。
現在,如果RGB三個值都處于全強度,這意味著其組合值為255,該值表示為白色,如果所有三種顏色都被減弱,或者值設置為0,其值表示為黑色。反過來,三者的不同組合將為我們提供不同特定的像素顏色。由于每個數字都是8比特,因此像素值的取值范圍為0-255,從下圖可以看到,但R的強度為37.3%,G的強度為45.9%,B的強度為18.8%時,組合成的顏色為深綠(dark green)。

三種顏色的不同組合將產生不同的顏色,由于每個值可以具有256個不同的強度或亮度值,因此總共有1680萬(256 x 256 x 256)種不同組合。
圖像的基本知識介紹完畢后進入正題,以下內容將包含Numpy非常基本的圖像數據分析、還有一些Python數據包,比如imageio,matplotlib等。本系列博客內容結構如下,先介紹前三個部分:
- 導入圖像并觀察其屬性
- 拆分圖層
- 灰度化
- 對像素值使用邏輯運算符
- 使用邏輯運算符進行掩碼
- 衛星圖像數據分析
導入圖像
下面加載圖像并觀察其各種屬性。注意,在輸入下面代碼請確保好已經安裝好對應的python數據包。


觀察圖像的基本屬性

其輸出

ndarray的形狀表明它是一個三維矩陣,輸出結果的前兩個數字分別表示高度(height)和寬度(width),第三個數字(即3)表示是該圖像是三通道彩色圖:紅色、綠色和藍色。因此,如果我們計算RGB圖像的大小,則總像素大小將是weiheigh x width x 3。

這些值對于驗證而言是很重要的,因為8位顏色強度不能超出0到255范圍。
使用圖片可以分配變量,此外還可以訪問圖像的任何特定像素值,并且還可以分別訪問每個RGB通道。

在這種情況下:R = 109、G = 143、 B = 46,從這個配置可以看出該像素中有很多綠色,也可以通過三個通道的索引值來從中選擇出一個。根據一般規定:
- 索引0表示紅色通道
- 索引1表示綠色通道
- 索引2表示藍色通道
但在OpenCV中,Images并不是按照RGB的順序規定,而是BGR。 imageio.imread將圖像加載為RGB(或RGBA),但OpenCV假定圖像為BGR或BGRA(BGR是OpenCVcolour的默認的式)。

現在快速查看整個圖像中每個通道表示的圖像。






下面,也可以更改RGB的數值。例如,將下面行的紅色、綠色、,藍色圖層的值全部設置為全強度,即取值為255。
- R通道:第100行到110行
- G通道:第200行到210行
- B通道:行300行到310行
本次測試只在一張圖像上進行綜合處理,方便我們同時查看每個通道的值對圖像的影響。






為了更加清楚地對比分析,我們也改變部分列的像素值,這次測試同時更改RGB通道的值。


拆分圖層
通過以上測試,可以知道,圖像的每個像素點都是由三個整數表示。只需要拉出圖像陣列的正確切片,就可以將圖像分割成單獨的顏色分量。


灰度化
黑白圖像存儲在二維矩陣中,目前存在兩種類型的黑白圖像:
- 灰度:灰色陰影的范圍:0~255
- 二進制:像素為黑色或白色:0或255
灰度處理過程,就是將圖像從全彩色轉換為灰度圖。在圖像處理工具中,例如:在OpenCV中,在使用很多含住之前,需要將圖像進行灰度處理,這樣做是因為灰度處理簡化了圖像,幾乎像降噪一樣,這是因為灰度圖像中的信息比較少。
在python中有兩種方法可以將圖像轉換為灰度。但是,更直接的方法是使用matplotlib包,該包執行的操作是獲取原始圖像的RGB值后進行加權平均。


而通過GIMP將顏色轉換為灰度圖像有三種算法來完成任務:
- 亮度(Lightness)灰度等級計算為Lightness = ½×(max(R,G,B)+ min(R,G,B))
- 照明度(Luminosity)灰度級將計算為Luminosity= 0.21×R + 0.7×G + 0.07×B
- 平均亮度灰度級將計算為Average Brightness=(R + G + B)÷3
下面讓我們嘗試實現一下這三個算法中的一種吧,本文選擇Luminosity。



從圖中可以看到,圖像變為了灰度圖,且圖像矩陣變為了二維矩陣。
使用Numpy和Opencv完成圖像的基本數據分析(Part II)
作者:Mohammed Innat,機器學習和數據科學研究者