天天看點

《數字圖像處理與機器視覺——Visual C++與Matlab實作(第2版)》——2.2 MATLAB圖像類型及其存儲方式

本節書摘來自異步社群出版社《visual c++ 2012 開發權威指南》一書中的第2章,第2.2節,作者: 張铮 , 徐超 , 任淑霞 , 韓海玲,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

數字圖像處理與機器視覺——visual c++與matlab實作(第2版)

在小節介紹數字圖像的分類時,曾接觸到一些主要的圖像類型。本節就來看一看這些主要的圖像類型在matlab中是如何存儲和表示的,主要包括亮度圖像、rgb圖像、索引圖像、二值圖像和多幀圖像。

1.亮度圖像(intensity image)

亮度圖像即灰階圖像。matlab使用二維矩陣存儲亮度圖像,矩陣中的每個元素直接表示一個像素的亮度(灰階)資訊。例如,一個200×300像素的圖像被存儲為一個200行300列的矩陣,可以使用小節介紹的選取矩陣元素(或子塊)的方式來選擇圖像中的一個像素或一個區域。

如果矩陣元素的類型是雙精度的,則元素的取值範圍是從0到1;如果是8位無符号整數,則取值範圍從0到255。資料0表示黑色,而1(或255)表示最大亮度(通常為白色)。

圖1.8所示是一個使用雙精度矩陣存儲亮度圖像的例子。

《數字圖像處理與機器視覺——Visual C++與Matlab實作(第2版)》——2.2 MATLAB圖像類型及其存儲方式

圖1.8 matlab中亮度圖像的表示方法

2.rgb圖像(rgb image)

rgb圖像使用3個一組的資料表達每個像素的顔色,即其中的紅色、綠色和藍色分量。在matlab中,rgb圖像被存儲在一個m×n×3的三維數組中。對于圖像中的每個像素,存儲的3個顔色分量合成像素的最終顔色。例如,rgb圖像i中位置在11行40列的像素的rgb值為i(11,40,1:3)或i(11,40,:),該像素的紅色分量為i(11,40,1),藍色分量為i(11,40,3)。而i(:,:,1)則表示整個的紅色分量圖像。

rgb圖像同樣可以由雙精度數組或8位無符号整數數組存儲。圖1.9所示是一個使用雙精度數組存儲rgb圖像的例子。

《數字圖像處理與機器視覺——Visual C++與Matlab實作(第2版)》——2.2 MATLAB圖像類型及其存儲方式

圖1.9 matlab中rgb圖像的表示方式

3.索引圖像(indexed image)

索引圖像往往包含兩個數組,一個圖像資料矩陣(image matrix)和一個顔色索引表(colormap)。對應于圖像中的每一個像素,圖像資料數組都包含一個指向顔色索引表的索引值。

顔色索引表是一個m×3的雙精度型矩陣,每一行指定一種顔色的3個rgb分量,即color = [r g b]。其中r、g、b是實數類型的雙精度數,取值0~1。0表示全黑,1表示最大亮度。圖1.10給出一個索引圖像的執行個體,注意圖像中的每個像素都用整數表示,其含義為顔色索引表中對應顔色的索引。

圖像資料矩陣和顔色索引表的關系取決于圖像資料矩陣中存儲的資料類型是雙精度類型還是8位無符号整數。

如果圖像資料使用雙精度類型存儲,像素資料1表示顔色索引表中的第一行,像素資料2表示顔色索引表中的第二行,依此類推。而如果圖像資料使用8位無符号整數存儲,則存在一個額外的偏移量-1,像素資料0表示顔色索引表中的第一行,而1表示索引表中的第二行,以此類推。

8位方式存儲的圖像可以支援256種顔色(或256級灰階)。圖1.10中,資料矩陣使用的是雙精度類型,是以沒有偏移量,資料5表示顔色表中的第5種顔色。

《數字圖像處理與機器視覺——Visual C++與Matlab實作(第2版)》——2.2 MATLAB圖像類型及其存儲方式

圖1.10 matlab中索引圖像的表示方法

4.二值圖像(binary image)

在二值圖像中,像素的顔色隻有兩種可能取值:黑或白。matlab将二值圖像存儲為一個二維矩陣,每個元素的取值隻有0和1兩種情況,0表示黑色,而1表示白色。

二值圖像可以被看作是一種特殊的隻存在黑和白兩種顔色的亮度圖像,當然,也可以将二值圖像看作是顔色索引表中隻存在兩種顔色(黑和白)的索引圖像。

matlab中使用uint8型的邏輯數組存儲二值圖像,通過一個邏輯标志表示資料有效範圍是0到1,而如果邏輯标志未被置位,則有效範圍為0到255。

二值圖像的表示方法如圖1.11所示。

5.多幀圖像(multiframe image array)

對于某些應用,可能要處理多幅按時間或視角方式連續排列的圖像,稱之為多幀圖像(所謂“幀”就是影像動畫中最小機關的單幅影像畫面)。例如核磁共振成像資料或視訊片斷。matlab提供了在同一個矩陣中存儲多幀圖像的方法,實際上就是在圖像矩陣中增加一個次元來代表時間或視角資訊。例如,一個擁有5張連續的400×300像素的rgb圖像的多幀連續片斷的存儲方式是一個400×300×3×5的矩陣,一組同樣大小的灰階圖像則可以使用一個400×300×1×5的矩陣來存儲。

如果多幀圖像使用索引圖像的方式存儲,隻有圖像資料矩陣被按多幀形式存儲,而顔色索引表隻能公用。是以,在多幀索引圖像中,所有的索引圖像公用一個顔色索引表,進而隻能使用相同的顔色組合。

《數字圖像處理與機器視覺——Visual C++與Matlab實作(第2版)》——2.2 MATLAB圖像類型及其存儲方式

圖1.11 matlab中二值圖像的表示方法

◆ cat函數

cat函數可以在指定次元上連接配接數組,其調用方式如下。

<code>cat(dim, a, b);</code>

<code>cat(dim, a1, a2, …);</code>

此函數在第dim次元将第2至第n個參數提供的數組連接配接起來。于是,若要構造一個由5幅rgb圖像構成的多幀圖像組,使用的指令如下。

<code>anim=cat(4, a1, a2, a3, a4, a5);</code>

◆ 選擇存儲方式時的限制

圖像處理工具箱中的某些函數隻能處理圖像矩陣中的前2維或前3維資訊。當然,也可以使用它們處理擁有4個次元或5個次元的rgb圖像或者連續圖像序列,但這需要單獨處理每幀符合要求的亮度/二值/索引/rgb圖像。例如,顯示anim中的第3幀圖像需要使用如下方式。

<code>imshow(anim(:,:,:,3));</code>

函數imshow的作用是顯示一幀圖像,

注意  如果向一個函數傳遞了超過其所能夠處理的次元的圖像矩陣,那麼結果可能是不确定的。某些函數的行為可能是處理圖像的第一幀或第一個顔色次元,但某些函數可能帶來不确定的行為和處理結果。

預設情況下,matlab将絕大多數資料存儲為雙精度類型(64位浮點數)以保證運算的精确性。而對于圖像而言,這種資料類型在圖像尺寸較大時可能并不理想。例如,一張1000像素見方的圖像擁有100萬個像素,如果每個像素用64位二進制數表示,總共需要大約8mb的記憶體空間。

為了減小圖像資訊的空間開銷,可以将圖像資訊存為8位無符号整型數(uint8)或16位無符号整型數(uint16)的數組,這樣隻需要雙精度浮點數1/8或1/4的空間。在上述3種存儲類型中以雙精度和uint8使用最多,uint16的情況與uint8大緻類似。

繼續閱讀