1. 程式人生 > >第3章 圖像基礎

第3章 圖像基礎

建圖 導致 trac 顯示 height 部分 waitkey 而是 著名

3圖像基礎

  在開始構建圖像分類器之前,首先要理解圖像是什麽。首先要理解圖像的基石——像素。

1 像素——圖像的基石

  像素是圖像最原始的構建塊。每副圖像由像素集合構成。通常,像素考慮為給定一副圖片下,在給定位置的“顏色”或亮度的“強度”。如圖1所示:

技術分享圖片

圖1 1000像素寬,750像素高的圖像

圖1的圖像為1000*750分辨率,意味著1000像素寬且750像素高。我們可以用矩陣來概念化圖像,在這個例子中,矩陣1000列(寬)和750行(高),即該圖像總共1000*750=750000像素。

大多數像素以兩種方式描述:

(1) 灰階/單通道

(2) 彩色/多通道

灰階圖像,每個像素是在0-255的標量值,其中0對應於“黑色”,255對應於“白色”。值是0-255之間的灰色陰影,越接近0則越黑,越接近於255則越亮。如圖2所示:

技術分享圖片

圖2 從0到255的圖像梯度像素表示

在RGB顏色空降中的像素值不再是標量,而是以三個值構成的列表來表示:一個是Red分量、Green分量和Blue分量。因此要定義一副以RGB顏色模型的圖像,我們只需要定義每個像素的RGB分量大小即可。

在一副RGB圖像中的所有像素對應的Red分量構成一個通道,另外Green、Blue分量則分別構成另外2個通道,即RGB分別對應1個通道。每個通道的值對應[0,255]總共256個“陰影”。給定僅在[0-255]之間的像素值,我們通常使用8bit無符號整數來表示強度。

一旦我們構建第一個神經網絡,我們通常通過執行均值減法(mean subtraction)或縮放(scale)來預處理圖像,這將需要我們將圖像轉換為浮點數據類型。請記住這一點,因為庫從磁盤(例如opencv)加載圖像所使用的數據類型在直接將學習算法應用於圖像之前,通常需要進行轉換。

考慮Red、Green、Blue三個值,我們可以將它們構成RGB的三元組形式(red, green, blue)。這個元組表示RGB顏色空間中的一個特定顏色。可以看出,RGB顏色空間的顏色為加法顏色空間:每個顏色加的越多,像素月亮且越接近白色。顏色空間如圖3所示:

技術分享圖片

圖3 左:RGB加性顏色空間 右:RGB立方體

例如,我們可以表示白色:(255,255,255),黑色(0,0,0)。RGB顏色空間也可表示為圖3右側的立方體方式,由於RGB三通道總共256*256*256種可能的顏色,依賴於RGB各自的取值。

RGB顏色空間的主要缺陷是:

(1)它的加特性,使得不使用“顏色選擇器”工具情況下,對於定義顏色有點不直觀。

(2)它不能模擬人類對顏色的感知。

除了這些,幾乎遇到的所有圖片都使用RGB方式。

1.1 由通道構建一副圖像

由於一個RGB圖像是由R/G/B三個分量構成,我們可以將RGB圖像概念化為由寬W和高H組成的三個獨立分量構成。我們可以將這三個參數用W*H*D的三維數組表示,其中D為深度或圖像的通道。如圖4所示:

技術分享圖片

圖4 表示一個RGB圖像,每個通道都是獨立的矩陣,組合。

(1) RGB顏色空間中,每個像素值是R、G、B的三個整數構成;

(2) 而在NumPy的多維數組中,編程表示則是用寬、高、深度表示。

2 圖像坐標系統

前面提到,圖像是由像素的網格來表示的。那麽,在圖像坐標系統中,(0,0)點對應於圖像的左上的角點,隨著向右向下移動,x與y的值隨之增大。

技術分享圖片

圖5 字符“I”在8*8的圖像表示,x向右,y向下。Python中以0開始索引

例如,以0開始索引,那麽像素4寬、5高的圖像,最大索引坐標為(3,4)。

2.1 由NumPy數組表示圖像

圖像處理庫如opencv和scikit-image,將RGB圖像表示為以shape(形狀)(height,width,channel)表示的多維NumPy數組。註意:這裏高度在前,寬度在後,與像素圖像表示的寬在前、高再厚相反。因為矩陣中的行對應於圖像的高度。

如示例程序load_display.py:

import cv2

image = cv2.imread(“lena.jpg”)

print(image.shape) //顯示shape形狀

cv2.imshow(“IMAGE”, image)

cv2.waitKey(0) //等待點擊操作,關閉窗口

保存後,我們執行:python load_display.py將顯示lena.jpg的圖片,且打印出該圖片的shape:(512,512,3),即高512、寬512、3通道。

技術分享圖片

如果要獲取單獨像素點的RGB值,則:

(b,g,r) = image[20, 100] //註意20為高、100為寬,且返回的值為BGR形式。

2.2 BGR和RGB順序

註意:opencv中存儲RGB的通道值是反序的。即我們通常考慮的是Red、Green、Blue,而opencv中則是Blue、Green、Red。原因竟然是歷史上,opencv的早期開發者選擇了BGR的順序,由於當時著名的相機制造商等等都以BGR的順序。這裏我們僅僅記住即可。

3 縮放和長寬比率

Scale或者resize,是以圖像寬度和高度來增加或縮小圖像大小的過程。改變圖像大小,最主要的是保持圖像aspect ratio(長寬比率),該值是圖像高與寬的比值。而忽略長寬比率可能使圖片看起來壓縮和扭曲。如下圖所示:

技術分享圖片

圖 6 左:原始圖像 右、上:無長寬比率的圖像縮放

為了防止這種縮放問題,我們僅僅在改變圖像大小時,通過按比例縮放寬與高。從美學觀點來看,我們常常確保這種長寬比率,但是這種原則卻不太適合深度學習。大多數神經網絡和CNNs應用圖像分類任務是假定一個固定大小的輸入,意味著傳遞給網絡的所有圖像的維度必須大小相等。CNNs網絡通常的寬高大小為32*32、64*64、224*224、227*227、256*256和299*299。

假定我們設計網絡輸入為224*224,但是數據集大小包括312*234、320*240等等,我們如何處理這些圖像呢?我們是僅僅忽略長寬比率而處理扭曲的圖像(圖7下部左側)?還是采取另一種策略縮放圖像,即沿著最短維度縮放圖像並且采取中心不變(center crop?)(圖7下部右側)。

技術分享圖片

圖7 上:原圖 下左:忽略ratio 下右:首先沿著最短維度縮放然後取center crop

由圖7下左可知,忽略長寬比率,將導致圖片看起來扭曲且“crunched”。而下右,保持了長寬比率,但是犧牲了圖像的一部分內容,因此,如果我們不小心將要識別的物體的一部分或全部割下(crop),這將對我們的圖像分類系統造成特別的損害。

那麽,最好的方法就是具體問題具體分析。對於一些數據集,忽略比率將更有優勢;而另一些數據集可能沿著最短維度縮放然後center crop更好。

對於這些方法及應用將在後續中講解,這裏我們僅僅是要理解圖像的基礎部分以及它們是如何表示的。

第3章 圖像基礎